Hướng dẫn how do i convert a python file to a module? - làm cách nào để chuyển đổi một tệp python thành một mô-đun?

Nó phổ biến để tạo ra các tập lệnh nhỏ mà chúng tôi muốn kết hợp thành một kịch bản lớn hơn. Chúng tôi không muốn sao chép và dán mã. Chúng tôi muốn để lại mã làm việc trong một tệp và sử dụng nó ở nhiều nơi. Thường thì chúng tôi muốn kết hợp các yếu tố từ nhiều tệp để tạo các tập lệnh tinh vi hơn.

Vấn đề chúng tôi có là khi chúng tôi nhập một tập lệnh, nó thực sự bắt đầu chạy. Đây thường không phải là những gì chúng tôi mong đợi khi chúng tôi nhập một tập lệnh để chúng tôi có thể sử dụng lại nó. Làm thế nào chúng ta có thể nhập các chức năng (hoặc lớp) từ một tệp mà không cần tập lệnh bắt đầu làm gì đó?

Sẵn sàng

Hãy nói rằng chúng tôi có một triển khai tiện dụng của hàm khoảng cách Haversine được gọi là haversine() và nó trong một tệp có tên script.py.

Ban đầu, tệp có thể trông như thế này:

import csv 
import pathlib 
from math import radians, sin, cos, sqrt, asin 
from functools import partial 

MI= 3959 
NM= 3440 
KM= 6373 

def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 

nm_haversine = partial(haversine, R=NM) 

source_path = pathlib.Path("waypoints.csv") 
with source_path.open() as source_file: 
    reader= csv.DictReader(source_file) 
    start = next(reader) 
    for point in reader: 
        d = nm_haversine( 
            float(start['lat']), float(start['lon']), 
            float(point['lat']), float(point['lon']) 
        ) 
        print(start, point, d) 
        start= point 

Chúng tôi đã bỏ qua phần thân của chức năng haversine(), chỉ hiển thị và nhiều hơn nữa, vì nguồn đầy đủ có sẵn trên GitHub. Chúng tôi tập trung vào bối cảnh trong đó hàm nằm trong tập lệnh Python cũng mở một tệp,

MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
1 và thực hiện một số xử lý trên tệp đó.

Làm thế nào chúng ta có thể nhập mô -đun này mà không cần in hiển thị khoảng cách giữa các điểm tham gia trong tệp

MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
2 của chúng tôi?

Làm thế nào để làm nó…

Các tập lệnh Python có thể đơn giản để viết. Thật vậy, nó thường quá đơn giản để tạo ra một kịch bản làm việc. Ở đây, cách chúng tôi chuyển đổi một tập lệnh đơn giản thành một thư viện có thể tái sử dụng:

1) Xác định các câu lệnh thực hiện công việc của tập lệnh: Chúng tôi sẽ phân biệt giữa định nghĩa và hành động. Các tuyên bố như

MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
3,
MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
4 và
MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
5 có nghĩa là rõ ràng, họ hỗ trợ công việc nhưng họ không làm việc. Hầu như tất cả các tuyên bố khác đều có hành động. Trong ví dụ của chúng tôi, chúng tôi có bốn câu lệnh chuyển nhượng nhiều hơn hành động. Sự khác biệt hoàn toàn là một trong những ý định. Tất cả các tuyên bố, theo định nghĩa, thực hiện một hành động. Tuy nhiên, những hành động này giống như hành động của câu lệnh DEF hơn là giống như hành động của câu lệnh
MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
6 sau đó trong kịch bản. Dưới đây là các tuyên bố xác định chung:

MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 

Phần còn lại của các tuyên bố rõ ràng có một hành động đối với việc tạo ra kết quả in.

2) Kết hợp các hành động thành một hàm:

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 

3) Nếu có thể, trích xuất nghĩa đen và biến chúng thành các tham số. Đây thường là một chuyển động đơn giản của nghĩa đen sang một tham số có giá trị mặc định. Từ đây:

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 

Với điều này:

def analyze(source_name="waypoints.csv"): 
    source_path = pathlib.Path(source_name) 

4) Bao gồm các điều sau đây là câu lệnh hành động cấp cao duy nhất trong tệp tập lệnh:

if __name__ == "__main__": 
    analyze() 

Chúng tôi đã đóng gói hành động của tập lệnh như một hàm. Tập lệnh hành động cấp cao nhất hiện được gói trong một câu lệnh IF để nó được thực hiện trong quá trình nhập.

Làm thế nào nó hoạt động…

Quy tắc quan trọng nhất đối với Python là

MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
3 của mô -đun về cơ bản giống như chạy mô -đun như một tập lệnh. Các câu lệnh trong tệp được thực thi theo thứ tự từ trên xuống dưới.

Khi chúng tôi nhập một tệp, chúng tôi thường quan tâm đến việc thực thi các câu lệnh

MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
4 và
MI= 3959 
NM= 3440
KM= 6373 
    
def haversine( lat_1: float, lon_1: float, 
    lat_2: float, lon_2: float, *, R: float ) -> float: 
    ... and more ... 
    
nm_haversine = partial(haversine, R=NM) 
5. Chúng tôi có thể quan tâm đến một số tuyên bố chuyển nhượng.

Khi Python chạy một tập lệnh, nó đặt một số biến đặc biệt tích hợp. Một trong số đó là

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
0. Biến này có hai giá trị khác nhau, tùy thuộc vào ngữ cảnh mà tệp đang được thực thi:

  • Tập lệnh cấp cao nhất, được thực hiện từ dòng lệnh: Trong trường hợp này, giá trị của tên đặc biệt tích hợp của

    def analyze(): 
        source_path = pathlib.Path("waypoints.csv") 
        with source_path.open() as source_file: 
        	reader= csv.DictReader(source_file) 
        	start = next(reader) 
        	for point in reader: 
        		d = nm_haversine( 
        			float(start['lat']), float(start['lon']), 
        			float(point['lat']), float(point['lon']) 
        			) 
        		print(start, point, d) 
        		start= point 
    0 được đặt thành
    def analyze(): 
        source_path = pathlib.Path("waypoints.csv") 
        with source_path.open() as source_file: 
        	reader= csv.DictReader(source_file) 
        	start = next(reader) 
        	for point in reader: 
        		d = nm_haversine( 
        			float(start['lat']), float(start['lon']), 
        			float(point['lat']), float(point['lon']) 
        			) 
        		print(start, point, d) 
        		start= point 
    2.

  • Một tệp được thực thi do một câu lệnh nhập: trong trường hợp này, giá trị của

    def analyze(): 
        source_path = pathlib.Path("waypoints.csv") 
        with source_path.open() as source_file: 
        	reader= csv.DictReader(source_file) 
        	start = next(reader) 
        	for point in reader: 
        		d = nm_haversine( 
        			float(start['lat']), float(start['lon']), 
        			float(point['lat']), float(point['lon']) 
        			) 
        		print(start, point, d) 
        		start= point 
    0 là tên của mô -đun được tạo.

Tên tiêu chuẩn của

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
2 có vẻ hơi kỳ lạ lúc đầu. Tại sao không sử dụng tên tệp trong mọi trường hợp? Tên đặc biệt này được gán vì một tập lệnh Python có thể được đọc từ một trong nhiều nguồn. Nó có thể là một tập tin. Python cũng có thể được đọc từ đường ống
def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
5 hoặc nó có thể được cung cấp trên dòng lệnh Python bằng tùy chọn
def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
6.

Tuy nhiên, khi một tệp đang được nhập, giá trị của

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
0 được đặt thành tên của mô -đun. Nó sẽ không phải là
def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
2. Trong ví dụ của chúng tôi, giá trị
def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
    with source_path.open() as source_file: 
    	reader= csv.DictReader(source_file) 
    	start = next(reader) 
    	for point in reader: 
    		d = nm_haversine( 
    			float(start['lat']), float(start['lon']), 
    			float(point['lat']), float(point['lon']) 
    			) 
    		print(start, point, d) 
    		start= point 
0 trong quá trình xử lý nhập sẽ là
def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
0.

Còn nữa…

Bây giờ chúng ta có thể xây dựng công việc hữu ích xung quanh một thư viện có thể tái sử dụng. Chúng tôi có thể tạo một số tệp trông như thế này:

Tệp

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
1:

from script import analyze 
analyze('trip_1.csv') 

Hoặc có lẽ một cái gì đó thậm chí còn phức tạp hơn:

Tệp

def analyze(): 
    source_path = pathlib.Path("waypoints.csv") 
2:

from script import analyze 
for trip in 'trip_1.csv', 'trip_2.csv': 
    analyze(trip) 

Mục tiêu là phân tách một giải pháp thực tế thành hai bộ sưu tập các tính năng:

  • Định nghĩa của các lớp và chức năng
  • Một tập lệnh hành động rất nhỏ sử dụng các định nghĩa để thực hiện công việc hữu ích

Để đạt được mục tiêu này, chúng tôi sẽ thường bắt đầu với một kịch bản kết hợp cả hai bộ tính năng. Loại kịch bản này có thể được xem như một giải pháp tăng đột biến. Giải pháp Spike của chúng tôi sẽ phát triển theo hướng giải pháp tinh tế hơn ngay khi chúng tôi chắc chắn rằng nó hoạt động.spike solution. Our spike solution should evolve towards a more refined solution as soon as we’re sure that it works.

Spike hoặc Piton là một phần của thiết bị leo núi có thể tháo rời mà không khiến chúng ta cao hơn trên tuyến đường, nhưng nó cho phép chúng ta leo lên an toàn.

Cũng thấy

  • Làm thế nào để chạy một mô -đun Python dưới dạng tập lệnh?
  • PEP 338 - Thực thi các mô -đun dưới dạng tập lệnh
  • Nếu name == Main Main trong Python là gì?name == “main” in Python?
  • Sự khác biệt giữa một mô -đun và tập lệnh trong Python là gì?

Một tệp .py có phải là một mô -đun không?

Nói một cách đơn giản, một mô -đun là một tệp bao gồm mã Python. Nó có thể xác định các chức năng, lớp và biến và cũng có thể bao gồm mã có thể chạy được. Bất kỳ tệp Python nào cũng có thể được tham chiếu như một mô -đun. Một tệp chứa mã Python, ví dụ: test.py, được gọi là mô -đun và tên của nó sẽ được kiểm tra.a module is a file consisting of Python code. It can define functions, classes, and variables, and can also include runnable code. Any Python file can be referenced as a module. A file containing Python code, for example: test.py , is called a module, and its name would be test .

Sự khác biệt giữa tệp python và mô -đun là gì?

Một tập lệnh là một tệp Python dự định sẽ được chạy trực tiếp.Khi bạn chạy nó, nó nên làm một cái gì đó.Điều này có nghĩa là các tập lệnh thường sẽ chứa mã được viết bên ngoài phạm vi của bất kỳ lớp hoặc hàm nào.Một mô -đun là một tệp Python dự định sẽ được nhập vào các tập lệnh hoặc các mô -đun khác.A module is a Python file that's intended to be imported into scripts or other modules.

Bạn có thể tạo các mô -đun tùy chỉnh của riêng bạn trong Python không?

Bạn có thể tự viết một mô -đun Python.Chúng có thể chứa các định nghĩa về chức năng, các lớp và các biến có thể được sử dụng trong các chương trình Python khác.. They can contain definitions of function, classes, and variables that can be used in other Python programs.

Làm thế nào để bạn tạo một mã mô -đun trong Python?

Các tập lệnh Python được mô đun hóa thông qua các chức năng, mô -đun và gói.Các chức năng cho phép các nhà phát triển giảm sự lặp lại trong mã của họ bằng cách thực hiện cùng một khối mã nhiều lần trong một chương trình.Bằng cách đặt cho chức năng một tên, nó có thể được sử dụng lại bằng cách tham chiếu tên của nó thay vì viết lại mã.through functions, modules, and packages. Functions allow developers to reduce repetition in their code by executing the same block of code multiple times in one program. By giving the function a name, it can be reused by referencing it's name instead of rewriting the code.