Python nhập từ danh sách

Trong khi viết mã, có thể cần một số mô-đun cụ thể. Vì vậy, chúng tôi nhập các mô-đun đó bằng cách sử dụng mã một dòng trong Python

Nhưng nếu tên của mô-đun cần thiết chỉ được chúng tôi biết trong thời gian chạy thì sao? . Nó cũng giúp nhập các mô-đun trong thời gian chạy

cú pháp. __import__(tên, toàn cầu, địa phương, danh sách từ, cấp độ)

Thông số.
tên. Tên của mô-đun sẽ được nhập
toàn cầu và địa phương. Diễn giải tên
danh sách biểu mẫu. Các đối tượng hoặc mô-đun con sẽ được nhập (dưới dạng danh sách)
cấp độ. Chỉ định sử dụng nhập tuyệt đối hay tương đối. Mặc định là -1 (tuyệt đối và tương đối).

Ví dụ 1




>>> __name__
'__main__'
90

>>> __name__
'__main__'
91

>>> __name__
'__main__'
92
>>> __name__
'__main__'
93
>>> __name__
'__main__'
94
>>> __name__
'__main__'
95
>>> __name__
'__main__'
96
>>> __name__
'__main__'
97
>>> __name__
'__main__'
890
>>> __name__
'__main__'
891
>>> __name__
'__main__'
892
>>> __name__
'__main__'
923
>>> __name__
'__main__'
924
>>> __name__
'__main__'
97
>>> __name__
'__main__'
926
>>> __name__
'__main__'
927
>>> __name__
'__main__'
894
>>> __name__
'__main__'
895

Khi chúng ta viết các chương trình python, chúng ta cần nhiều mô-đun khác để tận dụng các chức năng, lớp của chúng, v.v. trong chương trình hiện tại của chúng tôi. Chúng ta có thể nhập các mô-đun đó trong thời gian chạy bằng chức năng nhập. Mặc dù bạn cũng có thể nhập các mô-đun đã đặt tên ở đầu mã, nhưng bạn có thể cần mô-đun tạm thời chỉ cho một vài dòng mã hoặc bạn muốn tạo bản sao của một đối tượng từ mô-đun và sửa đổi cũng như sử dụng nó

cú pháp

Cú pháp của hàm __import__() là −

__import__(name, globals=None, locals=None, fromlist=(), level=0)
Where
name - the name of the module you want to import
globals and locals - determines how to interpret name
fromlist - objects or submodules that should be imported by name
level - specifies whether to use absolute or relative imports

Trong ví dụ dưới đây, chúng tôi nhập mô-đun DateTime và tạo các đối tượng tùy chỉnh với các giá trị cần thiết trong chương trình

Thí dụ

Bản thử trực tiếp

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

2021-01-12 07:38:54.903330
12-January

Việc sử dụng __import__ không được khuyến khích và bạn có thể nhập toàn bộ mô-đun ở đầu mã để đạt hiệu quả cao hơn

Nếu bạn hỏi tôi về khía cạnh dễ bị hiểu lầm nhất của Python, tôi sẽ trả lời mà không cần suy nghĩ kỹ. hệ thống nhập Python. Chỉ cần nhớ số lần bạn đã sử dụng nhập khẩu tương đối và nhận được một cái gì đó như

>>> __name__
'__main__'
5; . Mọi lập trình viên Python đều trải qua điều gì đó như thế này và các câu hỏi phổ biến về StackOverflow, chẳng hạn như chúng tôi Nhập tệp từ thư mục khác (1822 phiếu bầu), Nhập tương đối trong Python 3 (1064 phiếu) và Nhập tương đối lần thứ một tỷ (993 phiếu) là một chỉ số tốt

Hệ thống nhập Python không có vẻ phức tạp – nó phức tạp. Vì vậy, mặc dù tài liệu thực sự tốt nhưng nó không cung cấp cho bạn bức tranh toàn cảnh về những gì đang diễn ra. Cách duy nhất để có được một bức tranh như vậy là nghiên cứu điều gì xảy ra đằng sau hậu trường khi Python thực thi một câu lệnh nhập. Và đó là những gì chúng ta sẽ làm ngày hôm nay

Ghi chú. Trong bài viết này tôi đang đề cập đến CPython 3. 9. Một số chi tiết triển khai chắc chắn sẽ thay đổi khi CPython phát triển. Tôi sẽ cố gắng theo dõi những thay đổi quan trọng và thêm ghi chú cập nhật

Kế hoạch của chúng tôi

Trước khi chúng tôi bắt đầu, hãy để tôi trình bày cho bạn một phiên bản chi tiết hơn về kế hoạch của chúng tôi. Đầu tiên, chúng ta sẽ thảo luận về các khái niệm cốt lõi của hệ thống nhập khẩu. mô-đun, mô-đun con, gói, câu lệnh

>>> __name__
'__main__'
7, nhập tương đối, v.v. Sau đó, chúng tôi sẽ loại bỏ các câu lệnh nhập khác nhau và thấy rằng cuối cùng tất cả chúng đều gọi hàm
>>> __name__
'__main__'
8 tích hợp. Cuối cùng, chúng ta sẽ nghiên cứu cách triển khai mặc định của
>>> __name__
'__main__'
8 hoạt động. Đi nào

Mô-đun và đối tượng mô-đun

Hãy xem xét một tuyên bố nhập khẩu đơn giản

________số 8

Bạn nghĩ nó làm gì? . Và bạn sẽ đúng. Nhưng mô-đun chính xác là gì? . câu lệnh

>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
2 tìm kiếm một mô-đun có tên
>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
0, tạo một đối tượng mô-đun cho mô-đun đó và gán đối tượng mô-đun cho biến. Xem cách chúng tôi phân biệt giữa mô-đun và đối tượng mô-đun. Bây giờ chúng ta có thể định nghĩa các thuật ngữ này

Mô-đun là bất kỳ thứ gì mà Python coi là mô-đun và biết cách tạo đối tượng mô-đun cho. Điều này bao gồm những thứ như tệp Python, thư mục và mô-đun tích hợp được viết bằng C. Chúng ta sẽ xem danh sách đầy đủ trong phần tiếp theo

Lý do tại sao chúng tôi nhập bất kỳ mô-đun nào là vì chúng tôi muốn có quyền truy cập vào các hàm, lớp, hằng số và các tên khác mà mô-đun định nghĩa. Những tên này phải được lưu trữ ở đâu đó và đây là đối tượng mô-đun dành cho. Đối tượng mô-đun là một đối tượng Python hoạt động như một không gian tên cho tên của mô-đun. Tên được lưu trữ trong từ điển của đối tượng mô-đun (có sẵn dưới dạng

>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
4), vì vậy chúng tôi có thể truy cập chúng dưới dạng thuộc tính

Nếu bạn thắc mắc làm thế nào các đối tượng mô-đun được triển khai, thì đây là định nghĩa từ

>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
5

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

5

Trường

>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
6 lưu trữ từ điển của mô-đun. Các lĩnh vực khác không thực sự quan trọng cho cuộc thảo luận của chúng tôi

Python tạo các đối tượng mô-đun ngầm cho chúng ta. Để thấy rằng không có gì kỳ diệu trong quá trình này, chúng ta hãy tự tạo một đối tượng mô-đun. Chúng ta thường tạo các đối tượng Python bằng cách gọi các kiểu của chúng, như

>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
7 hoặc
>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
8. Loại đối tượng mô-đun là
>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
9 trong mã C nhưng nó không có sẵn trong Python dưới dạng tích hợp sẵn. May mắn thay, các loại "không khả dụng" như vậy có thể được tìm thấy trong mô-đun tiêu chuẩn
2021-01-12 07:38:54.903330
12-January
00

2021-01-12 07:38:54.903330
12-January
1

Mô-đun

2021-01-12 07:38:54.903330
12-January
00 định nghĩa
2021-01-12 07:38:54.903330
12-January
02 như thế nào? . Chúng ta cũng có thể làm được

2021-01-12 07:38:54.903330
12-January
6

Cho dù chúng tôi có được

2021-01-12 07:38:54.903330
12-January
02 bằng cách nào, một khi chúng tôi có được nó, chúng tôi có thể dễ dàng tạo một đối tượng mô-đun

2021-01-12 07:38:54.903330
12-January
8

Một đối tượng mô-đun mới được tạo không thú vị lắm nhưng có một số thuộc tính đặc biệt được khởi tạo trước

2021-01-12 07:38:54.903330
12-January
9

Hầu hết các thuộc tính đặc biệt này chủ yếu được sử dụng bởi chính hệ thống nhập khẩu, nhưng một số cũng được sử dụng trong mã ứng dụng. Ví dụ, thuộc tính

2021-01-12 07:38:54.903330
12-January
06 thường được sử dụng để lấy tên của mô-đun hiện tại

>>> __name__
'__main__'

Lưu ý rằng

2021-01-12 07:38:54.903330
12-January
06 có sẵn dưới dạng biến toàn cục. Quan sát này có vẻ hiển nhiên, nhưng nó rất quan trọng. Nó xuất phát từ thực tế là từ điển của các biến toàn cục được đặt thành từ điển của mô-đun hiện tại

>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True

Mô-đun hiện tại hoạt động như một không gian tên để thực thi mã Python. Khi Python nhập một tệp Python, nó sẽ tạo một đối tượng mô-đun mới và sau đó thực thi nội dung của tệp bằng cách sử dụng từ điển của đối tượng mô-đun làm từ điển của các biến toàn cục. Tương tự, khi Python thực thi trực tiếp một tệp Python, trước tiên, nó tạo một mô-đun đặc biệt có tên là

2021-01-12 07:38:54.903330
12-January
08 và sau đó sử dụng từ điển của nó làm từ điển của các biến toàn cục. Do đó, các biến toàn cục luôn là thuộc tính của một số mô-đun và mô-đun này được coi là mô-đun hiện tại theo quan điểm của mã thực thi

Các loại mô-đun khác nhau

Theo mặc định, Python nhận ra những thứ sau đây là mô-đun

  1. Các mô-đun tích hợp
  2. mô-đun đông lạnh
  3. tiện ích mở rộng C
  4. Tệp mã nguồn Python (_______209 tệp)
  5. Tệp mã byte Python (tệp ____360)
  6. thư mục

Các mô-đun tích hợp là các mô-đun C được biên dịch thành tệp thực thi

>>> __name__
'__main__'
61. Vì chúng là một phần của tệp thực thi nên chúng luôn có sẵn. Đây là tính năng chính của họ. Bộ dữ liệu
>>> __name__
'__main__'
62 lưu trữ tên của họ

2021-01-12 07:38:54.903330
12-January
0

Các mô-đun bị đóng băng cũng là một phần của tệp thực thi

>>> __name__
'__main__'
61, nhưng chúng được viết bằng Python. Mã Python được biên dịch thành một đối tượng mã và sau đó đối tượng mã sắp xếp lại được tích hợp vào tệp thực thi. Ví dụ về các mô-đun bị đóng băng là
>>> __name__
'__main__'
64 và
>>> __name__
'__main__'
65. Python đóng băng chúng vì chúng triển khai cốt lõi của hệ thống nhập và do đó, không thể nhập như các tệp Python khác

Các tiện ích mở rộng của C hơi giống các mô-đun tích hợp và hơi giống các tệp Python. Một mặt, chúng được viết bằng C hoặc C++ và tương tác với Python thông qua API Python/C. Mặt khác, chúng không phải là một phần của tệp thực thi nhưng được tải động trong quá trình nhập. Một số mô-đun tiêu chuẩn bao gồm

>>> __name__
'__main__'
66,
>>> __name__
'__main__'
67 và
>>> __name__
'__main__'
68 là phần mở rộng của C. Nhiều người khác bao gồm
>>> __name__
'__main__'
69,
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

500 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

501 được viết bằng Python nhưng gọi phần mở rộng C dưới mui xe. Về mặt kỹ thuật, các tiện ích mở rộng C là các thư viện được chia sẻ hiển thị chức năng khởi tạo được gọi là. Chúng thường được đặt tên như
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

502, nhưng phần mở rộng tệp có thể khác nhau tùy thuộc vào nền tảng. Ví dụ: trên macOS của tôi, bất kỳ tiện ích mở rộng nào trong số này sẽ hoạt động.
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

503,
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

504,
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

505. Và trên Windows, bạn sẽ thấy
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

506 và các biến thể của nó

Các tệp bytecode Python thường nằm trong thư mục

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

507 cùng với các tệp Python thông thường. Chúng là kết quả của việc biên dịch mã Python thành bytecode. Cụ thể hơn, tệp
>>> __name__
'__main__'
60 chứa một số siêu dữ liệu theo sau là đối tượng mã được sắp xếp theo thứ tự của một mô-đun. Mục đích của nó là giảm thời gian tải của mô-đun bằng cách bỏ qua giai đoạn biên dịch. Khi Python nhập tệp
2021-01-12 07:38:54.903330
12-January
09, trước tiên, nó sẽ tìm kiếm tệp
>>> __name__
'__main__'
60 tương ứng trong thư mục
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

507 và thực thi nó. Nếu tệp
>>> __name__
'__main__'
60 không tồn tại, Python sẽ biên dịch mã và tạo tệp

Tuy nhiên, chúng tôi sẽ không gọi các mô-đun tệp

>>> __name__
'__main__'
60 nếu chúng tôi không thể thực thi và nhập chúng trực tiếp. Ngạc nhiên thay, chúng ta có thể

>>> __name__
'__main__'
6

Để tìm hiểu thêm về các tệp

>>> __name__
'__main__'
60, hãy xem PEP 3147 -- PYC Repository Directories và PEP 552 -- Deterministic pycs

Như chúng ta sẽ thấy sau này, chúng ta có thể tùy chỉnh hệ thống nhập để hỗ trợ nhiều loại mô-đun hơn nữa. Vì vậy, mọi thứ đều có thể được gọi là mô-đun miễn là Python có thể tạo đối tượng mô-đun cho nó với tên mô-đun

Mô hình con và gói

Nếu tên mô-đun bị giới hạn ở các mã định danh đơn giản như

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

515 hoặc
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

516, thì tất cả chúng phải là duy nhất và chúng tôi sẽ phải suy nghĩ rất nhiều mỗi khi đặt tên cho một tệp mới. Vì lý do này, Python cho phép các mô-đun có các mô-đun con và tên mô-đun chứa dấu chấm

Khi Python thực thi câu lệnh này

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

50

đầu tiên nó nhập mô-đun

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

517 và sau đó là mô-đun con
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

518. Nó thêm mô-đun con vào từ điển của mô-đun và gán mô-đun cho biến
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

517, vì vậy chúng ta có thể truy cập mô-đun con dưới dạng thuộc tính của mô-đun

Một mô-đun có thể có các mô-đun con được gọi là gói. Về mặt kỹ thuật, một gói là một mô-đun có thuộc tính

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

520. Thuộc tính này cho Python biết nơi tìm kiếm các mô hình con. Khi Python nhập một mô-đun cấp cao nhất, nó sẽ tìm kiếm mô-đun đó trong các thư mục và kho lưu trữ ZIP được liệt kê trong
>>> __name__
'__main__'
6. Nhưng khi nó nhập một mô-đun con, nó sử dụng thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

520 của mô-đun mẹ thay vì
>>> __name__
'__main__'
6

gói thông thường

Thư mục là cách phổ biến nhất để tổ chức các mô-đun thành các gói. Nếu một thư mục chứa tệp

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524, nó được coi là một gói thông thường. Khi Python nhập một thư mục như vậy, nó sẽ thực thi tệp
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524, vì vậy các tên được xác định ở đó sẽ trở thành các thuộc tính của mô-đun

Tệp

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524 thường để trống hoặc chứa các thuộc tính liên quan đến gói, chẳng hạn như
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

527 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

528. Nó cũng có thể được sử dụng để tách API công khai của gói khỏi triển khai nội bộ của gói đó. Giả sử bạn phát triển một thư viện với cấu trúc sau

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

51

Và bạn muốn cung cấp cho người dùng thư viện của mình hai chức năng.

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

529 được định nghĩa trong
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

530 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

531 được định nghĩa trong
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

532. Nếu bạn để trống
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524, thì người dùng phải chỉ định các mô-đun con để nhập các chức năng

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

52

Nó có thể là thứ bạn muốn, nhưng bạn cũng có thể muốn cho phép người dùng nhập các chức năng như thế này

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

53

Vì vậy, bạn nhập các chức năng trong

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

54

Một thư mục có phần mở rộng C có tên là

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

535 hoặc có tệp
>>> __name__
'__main__'
60 có tên là
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

537 cũng là một gói thông thường. Python có thể nhập các gói như vậy hoàn toàn tốt

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

55

Gói không gian tên

Trước phiên bản 3. 3, Python chỉ có các gói thông thường. Các thư mục không có

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524 hoàn toàn không được coi là gói. Và đây là một vấn đề vì mọi người không muốn tạo các tệp
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524 trống. PEP 420 khiến các tệp này trở nên không cần thiết bằng cách giới thiệu các gói không gian tên trong Python 3. 3

Các gói không gian tên cũng giải quyết một vấn đề khác. Họ cho phép các nhà phát triển đặt nội dung của một gói trên nhiều địa điểm. Ví dụ: nếu bạn có cấu trúc thư mục sau

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

56

Và cả

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

540 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

541 đều ở trong
>>> __name__
'__main__'
6, sau đó bạn có thể nhập cả
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

543 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

544 như thế này

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

57

Điều này là do

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

545 là gói không gian tên chứa hai vị trí

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

58

Làm thế nào nó hoạt động? . Nếu sau khi duyệt qua tất cả các mục, nó không thể tìm thấy gói thông thường, tệp Python hoặc phần mở rộng C, nó sẽ tạo một đối tượng mô-đun có

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

520 chứa các thư mục đã ghi nhớ

Ý tưởng ban đầu về việc yêu cầu

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524 là để ngăn các thư mục có tên như
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

551 hoặc
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

552 che khuất các mô-đun tiêu chuẩn. Gói không gian tên không ẩn các mô-đun khác vì chúng có mức độ ưu tiên thấp hơn trong quá trình tìm kiếm mô-đun

Nhập khẩu từ các mô-đun

Bên cạnh việc nhập các mô-đun, chúng ta cũng có thể nhập các thuộc tính mô-đun bằng cách sử dụng câu lệnh

>>> __name__
'__main__'
7, như vậy

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

59

Câu lệnh này nhập một mô-đun có tên

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

554 và gán các thuộc tính đã chỉ định cho các biến tương ứng

2021-01-12 07:38:54.903330
12-January
10

Lưu ý biến

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

554 không có sau khi nhập coi như bị xóa

2021-01-12 07:38:54.903330
12-January
11

Khi Python thấy rằng một mô-đun không có thuộc tính được chỉ định, nó coi thuộc tính đó là một mô-đun con và cố gắng nhập nó. Vì vậy, nếu

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

554 định nghĩa
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

557 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

558 chứ không phải
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

559, Python sẽ cố gắng nhập
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

560

Nhập ký tự đại diện

Nếu chúng tôi không muốn chỉ định rõ ràng tên để nhập từ một mô-đun, chúng tôi có thể sử dụng hình thức nhập ký tự đại diện

2021-01-12 07:38:54.903330
12-January
12

Tuyên bố này hoạt động như thể

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

561 đã được thay thế bằng tất cả các tên công khai của mô-đun. Đây là những tên trong từ điển của mô-đun không bắt đầu bằng dấu gạch dưới
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

562 hoặc tên được liệt kê trong thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

563 nếu nó được xác định

Nhập khẩu tương đối

Cho đến bây giờ, chúng tôi đã nói với Python những mô-đun nào cần nhập bằng cách chỉ định tên mô-đun tuyệt đối. Câu lệnh

>>> __name__
'__main__'
7 cũng cho phép chúng tôi chỉ định tên mô-đun tương đối. Đây là vài ví dụ

2021-01-12 07:38:54.903330
12-January
13

Các cấu trúc như

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

565 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

566 là các tên mô-đun tương đối, nhưng chúng tương đối với cái gì? . Mô-đun hiện tại, giống như bất kỳ mô-đun nào khác, có thể thuộc về một gói. Gói này được gọi là gói hiện tại và đây là tên mô-đun tương đối có liên quan đến

Thuộc tính

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 của mô-đun lưu trữ tên của gói mà mô-đun thuộc về. Nếu mô-đun là một gói, thì mô-đun thuộc về chính nó và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 chỉ là tên của mô-đun (
2021-01-12 07:38:54.903330
12-January
06). Nếu mô-đun là mô-đun con, thì nó thuộc về mô-đun chính và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được đặt thành tên của mô-đun chính. Cuối cùng, nếu mô-đun không phải là gói cũng không phải là mô-đun con, thì gói của nó không được xác định. Trong trường hợp này,
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 có thể được đặt thành một chuỗi rỗng (e. g. mô-đun là mô-đun cấp cao nhất) hoặc
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572 (e. g. mô-đun chạy dưới dạng tập lệnh)

Tên mô-đun tương đối là tên mô-đun đứng trước một số dấu chấm. Một dấu chấm hàng đầu đại diện cho gói hiện tại. Vì vậy, khi

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được xác định, câu lệnh sau

2021-01-12 07:38:54.903330
12-January
14

hoạt động như thể dấu chấm đã được thay thế bằng giá trị của

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567

Mỗi dấu chấm phụ báo cho Python tăng một cấp từ

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567. Nếu
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được đặt thành
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

577, thì câu lệnh này

2021-01-12 07:38:54.903330
12-January
15

hoạt động như thể các dấu chấm được thay thế bằng

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

517

Bạn không thể di chuyển ra ngoài gói cấp cao nhất. Nếu bạn thử cái này

2021-01-12 07:38:54.903330
12-January
16

Python sẽ báo lỗi

2021-01-12 07:38:54.903330
12-January
17

Điều này là do Python không di chuyển qua hệ thống tệp để giải quyết các lần nhập tương đối. Nó chỉ lấy giá trị của

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567, loại bỏ một số hậu tố và thêm một hậu tố mới để có tên mô-đun tuyệt đối

Rõ ràng, nhập khẩu tương đối bị phá vỡ khi

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 hoàn toàn không được xác định. Trong trường hợp này, bạn gặp lỗi sau

2021-01-12 07:38:54.903330
12-January
18

Bạn thường thấy nó nhất khi chạy chương trình có nhập tương đối dưới dạng tập lệnh. Vì bạn chỉ định chương trình nào sẽ chạy với đường dẫn hệ thống tệp chứ không phải với tên mô-đun và vì Python cần tên mô-đun để tính toán

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567, nên mã được thực thi trong mô-đun
2021-01-12 07:38:54.903330
12-January
08 có thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được đặt thành
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572

Chạy chương trình dưới dạng mô-đun

Cách tiêu chuẩn để tránh lỗi nhập khi chạy chương trình có nhập tương đối là chạy chương trình dưới dạng mô-đun bằng cách sử dụng công tắc

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

585

2021-01-12 07:38:54.903330
12-January
19

Công tắc

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

585 yêu cầu Python sử dụng cùng một cơ chế để tìm mô-đun như trong quá trình nhập. Python lấy tên mô-đun và có thể tính toán gói hiện tại. Ví dụ: nếu chúng tôi chạy mô-đun có tên
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

587, trong đó
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

554 đề cập đến tệp
2021-01-12 07:38:54.903330
12-January
09 thông thường, thì mã sẽ được thực thi trong mô-đun
2021-01-12 07:38:54.903330
12-January
08 có thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được đặt thành
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

592. Bạn có thể đọc thêm về công tắc
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

585 trong tài liệu và trong PEP 338

Ổn thỏa. Đây là một sự khởi động. Bây giờ chúng ta sẽ xem chính xác điều gì sẽ xảy ra khi chúng ta nhập một mô-đun

Giảm báo cáo nhập khẩu

Nếu chúng tôi loại bỏ bất kỳ câu lệnh nhập nào, chúng tôi sẽ thấy rằng cuối cùng nó sẽ gọi hàm

>>> __name__
'__main__'
8 tích hợp. Hàm này lấy một tên mô-đun và một loạt các tham số khác, tìm mô-đun và trả về một đối tượng mô-đun cho nó. Ít nhất, đây là những gì nó phải làm

Python cho phép chúng tôi đặt

>>> __name__
'__main__'
8 thành một chức năng tùy chỉnh, vì vậy chúng tôi có thể thay đổi hoàn toàn quy trình nhập. Ví dụ, đây là một thay đổi phá vỡ mọi thứ

2021-01-12 07:38:54.903330
12-January
60

Bạn hiếm khi thấy mọi người ghi đè

>>> __name__
'__main__'
8 vì những lý do khác ngoài ghi nhật ký hoặc gỡ lỗi. Việc triển khai mặc định đã cung cấp các cơ chế mạnh mẽ để tùy chỉnh và chúng tôi sẽ chỉ tập trung vào nó

Việc triển khai mặc định của

>>> __name__
'__main__'
8 là
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

598. Vâng, nó gần như đúng. Mô-đun
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

599 là mô-đun tiêu chuẩn triển khai cốt lõi của hệ thống nhập. Nó được viết bằng Python vì quá trình nhập liên quan đến việc xử lý đường dẫn và những thứ khác mà bạn muốn làm bằng Python hơn là bằng C. Nhưng một số chức năng của
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

599 được chuyển sang C vì lý do hiệu suất. Và mặc định
>>> __name__
'__main__'
8 thực sự gọi một cổng C của
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

598. Đối với mục đích của chúng tôi, chúng tôi có thể bỏ qua sự khác biệt một cách an toàn và chỉ nghiên cứu phiên bản Python. Trước khi chúng tôi làm điều đó, hãy xem các câu lệnh nhập khác nhau gọi
>>> __name__
'__main__'
8 như thế nào

Nhập khẩu đơn giản

Nhớ lại rằng một đoạn mã Python được thực thi theo hai bước

  1. Trình biên dịch biên dịch mã thành bytecode
  2. VM thực thi bytecode

Để xem câu lệnh nhập làm gì, chúng ta có thể xem mã byte được tạo cho nó và sau đó tìm hiểu xem mỗi lệnh mã byte làm gì bằng cách xem vòng đánh giá trong

2021-01-12 07:38:54.903330
12-January
104

Để lấy mã byte, chúng tôi sử dụng mô-đun chuẩn

2021-01-12 07:38:54.903330
12-January
105

2021-01-12 07:38:54.903330
12-January
61

Lệnh

2021-01-12 07:38:54.903330
12-January
106 đầu tiên đẩy
2021-01-12 07:38:54.903330
12-January
107 lên ngăn xếp giá trị.
2021-01-12 07:38:54.903330
12-January
106 thứ hai đẩy
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572. Sau đó, lệnh
2021-01-12 07:38:54.903330
12-January
110 thực hiện điều gì đó mà chúng ta sẽ xem xét ngay sau đây. Cuối cùng,
2021-01-12 07:38:54.903330
12-January
111 gán giá trị trên cùng của ngăn xếp giá trị cho biến
>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
0

Đoạn mã thực thi lệnh

2021-01-12 07:38:54.903330
12-January
110 như sau

2021-01-12 07:38:54.903330
12-January
62

Tất cả các hành động xảy ra trong hàm

2021-01-12 07:38:54.903330
12-January
114. Nó gọi
>>> __name__
'__main__'
8 để thực hiện công việc, nhưng nếu
>>> __name__
'__main__'
8 không bị ghi đè, nó sẽ sử dụng phím tắt và gọi cổng C của
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

598 được gọi là
2021-01-12 07:38:54.903330
12-January
118. Đây là cách logic này được triển khai trong mã

2021-01-12 07:38:54.903330
12-January
63

Nếu bạn kiểm tra cẩn thận tất cả những điều trên, bạn sẽ có thể kết luận rằng tuyên bố này

________số 8

thực sự tương đương với mã này

2021-01-12 07:38:54.903330
12-January
65

ý nghĩa của các đối số theo chuỗi tài liệu của

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

598 như sau

2021-01-12 07:38:54.903330
12-January
66

Như chúng tôi đã nói, tất cả các câu lệnh nhập cuối cùng đều gọi

>>> __name__
'__main__'
8. Họ khác nhau về những gì họ làm trước và sau cuộc gọi và cách họ thực hiện cuộc gọi. Nhập khẩu tương đối, ví dụ, vượt qua khác không
2021-01-12 07:38:54.903330
12-January
121, và câu lệnh
>>> __name__
'__main__'
7 vượt qua không trống
2021-01-12 07:38:54.903330
12-January
123

Bây giờ chúng ta hãy thể hiện các câu lệnh nhập khác qua

>>> __name__
'__main__'
8 như chúng ta đã thể hiện
>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
2 nhưng lần này nhanh hơn nhiều

Nhập mô-đun con

tuyên bố này

2021-01-12 07:38:54.903330
12-January
67

biên dịch thành mã byte sau

2021-01-12 07:38:54.903330
12-January
68

và tương đương với đoạn mã sau

2021-01-12 07:38:54.903330
12-January
69

Các đối số của

>>> __name__
'__main__'
8 được truyền giống như trong trường hợp của
>>> import sys
>>> current_module = sys.modules[__name__] # sys.modules stores imported modules
>>> current_module.__dict__ is globals()
True
2. Điểm khác biệt duy nhất là VM gán kết quả của
>>> __name__
'__main__'
8 không phải cho tên của mô-đun (
2021-01-12 07:38:54.903330
12-January
129 không phải là tên biến hợp lệ) mà cho mã định danh đầu tiên trước dấu chấm, i. e.
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

517. Như chúng ta sẽ thấy,
>>> __name__
'__main__'
8 trả về mô-đun cấp cao nhất trong trường hợp này

từ nhập khẩu

tuyên bố này

2021-01-12 07:38:54.903330
12-January
80

biên dịch thành mã byte sau

2021-01-12 07:38:54.903330
12-January
81

và tương đương với đoạn mã sau

2021-01-12 07:38:54.903330
12-January
82

Tên để nhập được thông qua là

2021-01-12 07:38:54.903330
12-January
123. Khi
2021-01-12 07:38:54.903330
12-January
123 không trống,
>>> __name__
'__main__'
8 không trả về mô-đun cấp cao nhất như trong trường hợp nhập đơn giản mà trả về mô-đun được chỉ định như
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

518

từ nhập *

tuyên bố này

2021-01-12 07:38:54.903330
12-January
83

biên dịch thành mã byte sau

2021-01-12 07:38:54.903330
12-January
84

và tương đương với đoạn mã sau

2021-01-12 07:38:54.903330
12-January
85

Thuộc tính

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

563 liệt kê tất cả các tên công khai của mô-đun. Nếu một số tên được liệt kê trong
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

563 không được xác định, thì
>>> __name__
'__main__'
8 sẽ cố gắng nhập chúng dưới dạng mô hình con

Nhập khẩu tương đối

tuyên bố này

2021-01-12 07:38:54.903330
12-January
86

biên dịch thành mã byte sau

2021-01-12 07:38:54.903330
12-January
87

và tương đương với đoạn mã sau

2021-01-12 07:38:54.903330
12-January
88

Đối số

2021-01-12 07:38:54.903330
12-January
121 cho biết
>>> __name__
'__main__'
8 có bao nhiêu dấu chấm hàng đầu mà nhập tương đối có. Vì nó được đặt thành
2021-01-12 07:38:54.903330
12-January
141, nên
>>> __name__
'__main__'
8 tính toán tên tuyệt đối của mô-đun bằng cách (1) lấy giá trị của
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 và (2) loại bỏ phần cuối cùng của nó. Thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 có sẵn cho
>>> __name__
'__main__'
8 vì nó được thông qua với
2021-01-12 07:38:54.903330
12-January
146

Bây giờ chúng ta đã hoàn thành các câu lệnh nhập và chỉ có thể tập trung vào hàm

>>> __name__
'__main__'
8

Bên trong __import__()

Khi tôi học cách chuẩn bị bài viết này, nghiên cứu

>>> __name__
'__main__'
8 bằng cách đi theo tất cả các đường dẫn mã của nó không phải là trải nghiệm thú vị nhất. Vì vậy, tôi cung cấp cho bạn một lựa chọn tốt hơn. Tôi sẽ tóm tắt các thuật toán chính của quy trình nhập bằng tiếng Anh đơn giản và cung cấp liên kết đến các chức năng triển khai các thuật toán này để bạn có thể đọc mã nếu có gì đó chưa rõ ràng

Thuật toán mà

>>> __name__
'__main__'
8 thực hiện có thể được tóm tắt như sau

  1. Nếu
    2021-01-12 07:38:54.903330
    12-January
    150, hãy phân giải tên mô-đun tương đối thành tên mô-đun tuyệt đối
  2. Nhập mô-đun
  3. Nếu
    2021-01-12 07:38:54.903330
    12-January
    123 trống, hãy bỏ mọi thứ sau dấu chấm đầu tiên khỏi tên mô-đun để lấy tên của mô-đun cấp cao nhất. Nhập và trả lại mô-đun cấp cao nhất
  4. Nếu
    2021-01-12 07:38:54.903330
    12-January
    123 chứa các tên không có trong từ điển của mô-đun, hãy nhập chúng dưới dạng mô-đun con. Nghĩa là, nếu
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    559 không có trong từ điển của mô-đun, hãy nhập
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    560. Nếu
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    561 nằm trong
    2021-01-12 07:38:54.903330
    12-January
    123, hãy sử dụng mô-đun
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    563 làm
    2021-01-12 07:38:54.903330
    12-January
    123 mới và lặp lại bước này
  5. Trả lại mô-đun

Bước 2 là nơi tất cả các hành động xảy ra. Chúng tôi sẽ tập trung vào nó trong các phần còn lại, nhưng trước tiên chúng ta hãy giải thích chi tiết về bước 1

Giải quyết họ hàng

Để giải quyết tên mô-đun tương đối,

>>> __name__
'__main__'
8 cần biết gói hiện tại của mô-đun mà từ đó câu lệnh nhập được thực thi. Vì vậy, nó tra cứu
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 trong
2021-01-12 07:38:54.903330
12-January
161. Nếu
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 là
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572, thì
>>> __name__
'__main__'
8 sẽ cố gắng suy ra gói hiện tại từ
2021-01-12 07:38:54.903330
12-January
06. Vì Python luôn đặt chính xác
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567, dự phòng này thường không cần thiết. Nó chỉ có thể hữu ích cho các mô-đun được tạo bằng các phương tiện khác với cơ chế nhập mặc định. Bạn có thể xem hàm
2021-01-12 07:38:54.903330
12-January
167 để biết chính xác cách tính gói cước hiện tại. Tất cả những gì chúng ta nên nhớ là quá trình nhập tương đối bị ngắt khi
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được đặt thành một chuỗi trống, như trong trường hợp mô-đun cấp cao nhất hoặc thành
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572, như trong trường hợp tập lệnh và có cơ hội thành công nếu không. Hàm sau đảm bảo điều này

2021-01-12 07:38:54.903330
12-January
89

Sau khi kiểm tra, tên họ hàng được giải quyết

2021-01-12 07:38:54.903330
12-January
90

>>> __name__
'__main__'
8 gọi
2021-01-12 07:38:54.903330
12-January
171 để nhập mô-đun

Quy trình nhập khẩu

Hàm

2021-01-12 07:38:54.903330
12-January
171 lấy tên mô-đun tuyệt đối và thực hiện các bước sau

  1. Nếu mô-đun ở trong
    2021-01-12 07:38:54.903330
    12-January
    173, hãy trả lại
  2. Khởi tạo đường dẫn tìm kiếm mô-đun tới
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    572
  3. Nếu mô-đun có mô-đun mẹ (tên chứa ít nhất một dấu chấm), hãy nhập mô-đun mẹ nếu nó chưa có trong
    2021-01-12 07:38:54.903330
    12-January
    173. Đặt đường dẫn tìm kiếm mô-đun thành
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    520 của cha mẹ
  4. Tìm thông số kỹ thuật của mô-đun bằng tên mô-đun và đường dẫn tìm kiếm mô-đun. Nếu không tìm thấy thông số kỹ thuật, hãy tăng
    2021-01-12 07:38:54.903330
    12-January
    177
  5. Tải mô-đun từ thông số kỹ thuật
  6. Thêm mô-đun vào từ điển của mô-đun mẹ
  7. Trả lại mô-đun

Tất cả các mô-đun đã nhập được lưu trữ trong từ điển

2021-01-12 07:38:54.903330
12-January
173. Từ điển này ánh xạ tên mô-đun tới các đối tượng mô-đun và hoạt động như một bộ đệm. Trước khi tìm kiếm một mô-đun,
2021-01-12 07:38:54.903330
12-January
171 kiểm tra
2021-01-12 07:38:54.903330
12-January
173 và trả về mô-đun ngay lập tức nếu nó ở đó. Các mô-đun đã nhập được thêm vào
2021-01-12 07:38:54.903330
12-January
181 ở cuối bước 5

Nếu mô-đun không có trong

2021-01-12 07:38:54.903330
12-January
173, thì
2021-01-12 07:38:54.903330
12-January
171 sẽ tiếp tục quá trình nhập. Quá trình này bao gồm tìm mô-đun và tải mô-đun. Trình tìm và trình tải là các đối tượng thực hiện các tác vụ này

Trình tìm và trình tải

Công việc của công cụ tìm là đảm bảo rằng mô-đun tồn tại, xác định trình tải nào sẽ được sử dụng để tải mô-đun và cung cấp thông tin cần thiết để tải, chẳng hạn như vị trí của mô-đun. Công việc của một trình tải là tạo một đối tượng mô-đun cho mô-đun và thực thi mô-đun. Cùng một đối tượng có thể hoạt động như một công cụ tìm và như một trình tải. Một đối tượng như vậy được gọi là một nhà nhập khẩu

Trình tìm kiếm triển khai phương thức

2021-01-12 07:38:54.903330
12-January
184 lấy tên mô-đun và đường dẫn tìm kiếm mô-đun và trả về thông số mô-đun. Thông số mô-đun là một đối tượng đóng gói trình tải và tất cả thông tin cần thiết để tải. Điều này bao gồm các thuộc tính đặc biệt của mô-đun. Chúng được sao chép đơn giản từ thông số kỹ thuật sau khi đối tượng mô-đun được tạo. Ví dụ:
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

520 được sao chép từ
2021-01-12 07:38:54.903330
12-January
186 và
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 được sao chép từ
2021-01-12 07:38:54.903330
12-January
188. Xem tài liệu để biết danh sách đầy đủ các thuộc tính spec

Để tìm một thông số kỹ thuật,

2021-01-12 07:38:54.903330
12-January
171 lặp lại các công cụ tìm được liệt kê trong
2021-01-12 07:38:54.903330
12-January
190 và gọi
2021-01-12 07:38:54.903330
12-January
184 trên từng công cụ cho đến khi tìm thấy thông số kỹ thuật. Nếu không tìm thấy thông số kỹ thuật,
2021-01-12 07:38:54.903330
12-January
171 tăng
2021-01-12 07:38:54.903330
12-January
177

Theo mặc định,

2021-01-12 07:38:54.903330
12-January
190 lưu trữ ba công cụ tìm

  1. 2021-01-12 07:38:54.903330
    12-January
    195 tìm kiếm các mô-đun tích hợp
  2. 2021-01-12 07:38:54.903330
    12-January
    196 tìm kiếm các mô-đun bị đóng băng;
  3. 2021-01-12 07:38:54.903330
    12-January
    197 tìm kiếm các loại mô-đun khác nhau bao gồm tệp Python, thư mục và tiện ích mở rộng C

Chúng được gọi là công cụ tìm đường dẫn meta. Python phân biệt chúng với các công cụ tìm mục nhập đường dẫn là một phần của

2021-01-12 07:38:54.903330
12-January
197. Chúng ta sẽ thảo luận về cả hai loại công cụ tìm trong các phần tiếp theo

Sau khi tìm thấy thông số kỹ thuật,

2021-01-12 07:38:54.903330
12-January
171 lấy trình tải từ thông số kỹ thuật và chuyển thông số kỹ thuật đó sang phương thức
2021-01-12 07:38:54.903330
12-January
600 của trình tải để tạo một đối tượng mô-đun. Nếu
2021-01-12 07:38:54.903330
12-January
600 không được triển khai hoặc trả về
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572, thì
2021-01-12 07:38:54.903330
12-January
171 sẽ tự tạo đối tượng mô-đun mới. Nếu đối tượng mô-đun không xác định một số thuộc tính đặc biệt, thường là như vậy, các thuộc tính sẽ được sao chép từ thông số kỹ thuật. Đây là cách logic này được triển khai trong mã

2021-01-12 07:38:54.903330
12-January
91

Sau khi tạo đối tượng mô-đun,

2021-01-12 07:38:54.903330
12-January
171 thực thi mô-đun bằng cách gọi phương thức
2021-01-12 07:38:54.903330
12-January
605 của trình tải. Phương thức này làm gì phụ thuộc vào trình tải, nhưng thông thường, nó sẽ đưa vào từ điển của mô-đun các hàm, lớp, hằng số và những thứ khác mà mô-đun định nghĩa. Ví dụ: trình tải tệp Python thực thi nội dung của tệp khi _____2605 được gọi

Quá trình tải đầy đủ được thực hiện như sau

2021-01-12 07:38:54.903330
12-January
92

Đoạn mã này thú vị vì nhiều lý do. Đầu tiên, một mô-đun được thêm vào

2021-01-12 07:38:54.903330
12-January
173 trước khi nó được thực thi. Do logic này, Python hỗ trợ nhập vòng tròn. Nếu chúng ta có hai mô-đun nhập lẫn nhau như thế này

2021-01-12 07:38:54.903330
12-January
93

2021-01-12 07:38:54.903330
12-January
94

Chúng tôi có thể nhập chúng mà không gặp vấn đề gì

2021-01-12 07:38:54.903330
12-January
95

Điều hấp dẫn là mô-đun

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

517 chỉ được khởi tạo một phần khi mô-đun
2021-01-12 07:38:54.903330
12-January
609 được thực thi. Vì vậy, nếu chúng ta sử dụng
2021-01-12 07:38:54.903330
12-January
610 trong
2021-01-12 07:38:54.903330
12-January
609

2021-01-12 07:38:54.903330
12-January
96

chúng tôi nhận được một lỗi

2021-01-12 07:38:54.903330
12-January
97

Thứ hai, một mô-đun bị xóa khỏi

2021-01-12 07:38:54.903330
12-January
173 nếu quá trình thực thi không thành công vì bất kỳ lý do gì, nhưng các mô-đun đã được nhập thành công dưới dạng tác dụng phụ vẫn còn trong
2021-01-12 07:38:54.903330
12-January
173

Cuối cùng, mô-đun trong

2021-01-12 07:38:54.903330
12-January
173 có thể được thay thế trong quá trình thực thi mô-đun. Do đó, mô-đun được tra cứu trong
2021-01-12 07:38:54.903330
12-January
173 trước khi nó được trả về

Bây giờ chúng tôi đã hoàn thành với

2021-01-12 07:38:54.903330
12-January
171 và
>>> __name__
'__main__'
8 và sẵn sàng để xem các công cụ tìm và trình tải khác nhau hoạt động như thế nào

BuildinImporter và FrozenImporter

Như chúng ta có thể đánh giá từ cái tên,

2021-01-12 07:38:54.903330
12-January
195 vừa là công cụ tìm vừa là trình tải các mô-đun tích hợp. Phương thức
2021-01-12 07:38:54.903330
12-January
184 của nó kiểm tra xem mô-đun có phải là mô-đun tích hợp hay không và nếu có, sẽ tạo một thông số kỹ thuật không chứa gì ngoài tên của mô-đun và trình tải. Phương thức
2021-01-12 07:38:54.903330
12-January
600 của nó tìm hàm init của mô-đun và gọi nó. Cả hai phương pháp đều dễ thực hiện vì tên mô-đun tích hợp được ánh xạ tĩnh tới các hàm init

2021-01-12 07:38:54.903330
12-January
98

Các hàm init là các hàm init giống như các phần mở rộng C xác định. Chúng tôi sẽ không thảo luận về cách chúng hoạt động ở đây, vì vậy nếu bạn muốn tìm hiểu thêm về điều này, hãy xem hướng dẫn Mở rộng Python với C hoặc C++

2021-01-12 07:38:54.903330
12-January
196 tìm các mô-đun bị đóng băng theo cách tương tự. Tên của chúng được ánh xạ tĩnh tới các đối tượng mã

2021-01-12 07:38:54.903330
12-January
99

Sự khác biệt với

2021-01-12 07:38:54.903330
12-January
195 là
2021-01-12 07:38:54.903330
12-January
600 trả về
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572. Các đối tượng mã được thực thi bởi
2021-01-12 07:38:54.903330
12-January
605

Bây giờ chúng tôi tập trung vào công cụ tìm đường dẫn meta mà các nhà phát triển ứng dụng nên quan tâm nhất

Trình tìm đường dẫn

2021-01-12 07:38:54.903330
12-January
197 tìm kiếm mô-đun trên đường dẫn tìm kiếm mô-đun. Đường dẫn tìm kiếm mô-đun là
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

520 của cha mẹ được chuyển dưới dạng đối số
2021-01-12 07:38:54.903330
12-January
628 thành
2021-01-12 07:38:54.903330
12-January
184 hoặc
>>> __name__
'__main__'
6 nếu đối số này là
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572. Nó được mong đợi là một chuỗi có thể lặp lại. Mỗi chuỗi, được gọi là mục nhập đường dẫn, phải chỉ định vị trí để tìm kiếm mô-đun, chẳng hạn như thư mục trên hệ thống tệp

2021-01-12 07:38:54.903330
12-January
197 không thực sự tự tìm kiếm nhưng liên kết từng mục nhập đường dẫn với một công cụ tìm mục nhập đường dẫn biết cách tìm các mô-đun ở vị trí được chỉ định bởi mục nhập đường dẫn. Để tìm một mô-đun,
2021-01-12 07:38:54.903330
12-January
197 lặp lại các mục nhập đường dẫn và đối với mỗi mục nhập, hãy gọi
2021-01-12 07:38:54.903330
12-January
184 của công cụ tìm mục nhập đường dẫn tương ứng

Để biết nên sử dụng công cụ tìm mục nhập đường dẫn nào cho một mục nhập cụ thể,

2021-01-12 07:38:54.903330
12-January
197 gọi các hook đường dẫn được liệt kê trong
2021-01-12 07:38:54.903330
12-January
636. Móc đường dẫn là một hàm có thể gọi được lấy mục nhập đường dẫn và trả về công cụ tìm mục nhập đường dẫn. Nó cũng có thể nâng
2021-01-12 07:38:54.903330
12-January
637, trong trường hợp đó,
2021-01-12 07:38:54.903330
12-January
197 sẽ thử cú móc tiếp theo. Để tránh gọi hook trong mỗi lần nhập,
2021-01-12 07:38:54.903330
12-January
197 lưu trữ kết quả trong từ điển
2021-01-12 07:38:54.903330
12-January
640 để ánh xạ mục nhập đường dẫn tới công cụ tìm mục nhập đường dẫn

Theo mặc định,

2021-01-12 07:38:54.903330
12-January
636 chứa hai móc đường dẫn

  1. một hook trả về các phiên bản
    2021-01-12 07:38:54.903330
    12-January
    642;
  2. một hook trả về các phiên bản
    2021-01-12 07:38:54.903330
    12-January
    643

Phiên bản

2021-01-12 07:38:54.903330
12-January
642 tìm kiếm các mô-đun trong kho lưu trữ ZIP hoặc trong một thư mục bên trong kho lưu trữ ZIP. Nó hỗ trợ các loại mô-đun giống như
2021-01-12 07:38:54.903330
12-January
643 ngoại trừ các tiện ích mở rộng C. Bạn có thể đọc thêm về
2021-01-12 07:38:54.903330
12-January
642 trong tài liệu và trong PEP 273. Phiên bản
2021-01-12 07:38:54.903330
12-January
643 tìm kiếm các mô-đun trong một thư mục. Chúng ta sẽ thảo luận về nó trong phần tiếp theo

Bên cạnh việc gọi các công cụ tìm mục nhập đường dẫn,

2021-01-12 07:38:54.903330
12-January
197 tạo thông số kỹ thuật cho các gói không gian tên. Khi công cụ tìm mục nhập đường dẫn trả về một thông số không chỉ định trình tải, điều này có nghĩa là thông số đó mô tả một phần của gói không gian tên (thường chỉ là một thư mục). Trong trường hợp này,
2021-01-12 07:38:54.903330
12-January
197 ghi nhớ thuộc tính
2021-01-12 07:38:54.903330
12-January
650 của thông số kỹ thuật này và tiếp tục với mục nhập đường dẫn tiếp theo với hy vọng rằng nó sẽ tìm thấy tệp Python, gói thông thường hoặc tiện ích mở rộng C. Nếu cuối cùng nó không tìm thấy bất kỳ phần nào trong số này, nó sẽ tạo một thông số kỹ thuật mới cho gói không gian tên có
2021-01-12 07:38:54.903330
12-January
650 chứa tất cả các phần được ghi nhớ

Tóm lại những gì chúng tôi đã nói về

2021-01-12 07:38:54.903330
12-January
197, đây là thuật toán hoàn chỉnh mà
2021-01-12 07:38:54.903330
12-January
184 của nó thực hiện

  1. Nếu
    2021-01-12 07:38:54.903330
    12-January
    628 là
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    572, hãy đặt
    2021-01-12 07:38:54.903330
    12-January
    628 thành
    >>> __name__
    '__main__'
    
    6
  2. Khởi tạo danh sách các mục nhập đường dẫn của gói không gian tên tiềm năng.
    2021-01-12 07:38:54.903330
    12-January
    658
  3. Đối với mỗi mục nhập đường dẫn trong
    2021-01-12 07:38:54.903330
    12-January
    628
    1. Tra cứu mục nhập trong
      2021-01-12 07:38:54.903330
      12-January
      640 để có công cụ tìm mục nhập đường dẫn
    2. Nếu mục nhập không có trong
      2021-01-12 07:38:54.903330
      12-January
      640, hãy gọi các hook được liệt kê trong
      2021-01-12 07:38:54.903330
      12-January
      636 cho đến khi một số hook trả về công cụ tìm mục nhập đường dẫn
    3. Lưu trữ công cụ tìm mục nhập đường dẫn trong
      2021-01-12 07:38:54.903330
      12-January
      640. Nếu không tìm thấy công cụ tìm mục nhập đường dẫn nào, hãy lưu trữ
      dttime = __import__('datetime', globals(), locals(), [], 0)
      print(dttime.datetime.now())
      # Make a copy of dttime
      x = dttime.datetime.now()
      # Get your custom results
      print(x.strftime("%d-%B"))
      
      
      572 và tiếp tục với mục nhập tiếp theo
    4. Gọi
      2021-01-12 07:38:54.903330
      12-January
      184 của công cụ tìm mục nhập đường dẫn. Nếu thông số kỹ thuật là
      dttime = __import__('datetime', globals(), locals(), [], 0)
      print(dttime.datetime.now())
      # Make a copy of dttime
      x = dttime.datetime.now()
      # Get your custom results
      print(x.strftime("%d-%B"))
      
      
      572, hãy tiếp tục với mục tiếp theo
    5. Nếu tìm thấy gói không gian tên (
      2021-01-12 07:38:54.903330
      12-January
      667 là
      dttime = __import__('datetime', globals(), locals(), [], 0)
      print(dttime.datetime.now())
      # Make a copy of dttime
      x = dttime.datetime.now()
      # Get your custom results
      print(x.strftime("%d-%B"))
      
      
      572), hãy mở rộng
      2021-01-12 07:38:54.903330
      12-January
      669 bằng
      2021-01-12 07:38:54.903330
      12-January
      186 và tiếp tục với mục tiếp theo
    6. Nếu không, hãy trả lại thông số kỹ thuật
  4. Nếu
    2021-01-12 07:38:54.903330
    12-January
    669 trống, trả về
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    572
  5. Tạo thông số gói không gian tên mới với
    2021-01-12 07:38:54.903330
    12-January
    650 dựa trên
    2021-01-12 07:38:54.903330
    12-January
    669
  6. Trả lại thông số kỹ thuật

Tất cả logic phức tạp này của

2021-01-12 07:38:54.903330
12-January
197 hầu như không cần thiết. Thông thường, một mục nhập đường dẫn chỉ là một đường dẫn đến một thư mục, vì vậy,
2021-01-12 07:38:54.903330
12-January
197 gọi phương thức
2021-01-12 07:38:54.903330
12-January
184 của một thể hiện
2021-01-12 07:38:54.903330
12-January
643 được trả về bởi hook tương ứng

Trình tìm tệp

Phiên bản

2021-01-12 07:38:54.903330
12-January
643 tìm kiếm các mô-đun trong thư mục được chỉ định bởi mục nhập đường dẫn. Mục nhập đường dẫn có thể là đường dẫn tuyệt đối hoặc đường dẫn tương đối. Trong trường hợp sau, nó được giải quyết đối với thư mục làm việc hiện tại

Phương thức

2021-01-12 07:38:54.903330
12-January
184 của
2021-01-12 07:38:54.903330
12-January
643 lấy tên mô-đun tuyệt đối nhưng chỉ cần phần "đuôi" sau dấu chấm cuối cùng vì phần gói đã được sử dụng để xác định thư mục cần tìm trong. Nó trích xuất "đuôi" như thế này

>>> __name__
'__main__'
0

Sau đó, nó thực hiện tìm kiếm. Nó tìm kiếm một thư mục có tên

2021-01-12 07:38:54.903330
12-January
682 chứa
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

524,
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

537 hoặc
2021-01-12 07:38:54.903330
12-January
685 với một số phần mở rộng tệp thư viện được chia sẻ như
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

505. Nó cũng tìm các tệp có tên
2021-01-12 07:38:54.903330
12-January
687,
2021-01-12 07:38:54.903330
12-January
688 và
2021-01-12 07:38:54.903330
12-January
689. Nếu nó tìm thấy bất kỳ thứ nào trong số này, nó sẽ tạo một thông số kỹ thuật với trình tải tương ứng

  • 2021-01-12 07:38:54.903330
    12-January
    690 cho phần mở rộng C
  • 2021-01-12 07:38:54.903330
    12-January
    691 cho tệp
    2021-01-12 07:38:54.903330
    12-January
    09;
  • 2021-01-12 07:38:54.903330
    12-January
    693 cho tệp
    >>> __name__
    '__main__'
    
    60

Nếu nó tìm thấy một thư mục không phải là gói thông thường, nó sẽ tạo một thông số kỹ thuật với bộ tải được đặt thành

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572.
2021-01-12 07:38:54.903330
12-January
197 thu thập một thông số gói không gian tên duy nhất từ ​​các thông số kỹ thuật đó

Thuật toán mà

2021-01-12 07:38:54.903330
12-January
184 thực hiện có thể được tóm tắt như sau

  1. Lấy phần cuối cùng của tên mô-đun.
    2021-01-12 07:38:54.903330
    12-January
    698
  2. Tìm thư mục có tên
    2021-01-12 07:38:54.903330
    12-January
    682 chứa
    2021-01-12 07:38:54.903330
    12-January
    800. Nếu tìm thấy, hãy tạo và trả lại thông số gói thông thường
  3. Tìm tệp có tên
    2021-01-12 07:38:54.903330
    12-January
    689 Nếu tìm thấy, hãy tạo và trả lại thông số tệp
  4. Lặp lại bước 2 và 3 cho tệp
    2021-01-12 07:38:54.903330
    12-January
    09 và tệp
    >>> __name__
    '__main__'
    
    60
  5. Nếu tìm thấy thư mục có tên
    2021-01-12 07:38:54.903330
    12-January
    682 không phải là gói thông thường, hãy tạo và trả về thông số gói không gian tên
  6. Nếu không, hãy trả lại
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    572

Một thông số gói thông thường được tạo như thế này

>>> __name__
'__main__'
1

một thông số tập tin như thế này

>>> __name__
'__main__'
2

và một gói không gian tên như thế này

>>> __name__
'__main__'
3

Khi thông số kỹ thuật được tạo, quá trình tải mô-đun bắt đầu.

2021-01-12 07:38:54.903330
12-January
690 rất đáng để nghiên cứu, nhưng chúng ta nên để nó cho một bài viết khác về tiện ích mở rộng C.
2021-01-12 07:38:54.903330
12-January
693 cũng không thú vị lắm nên cũng không bàn nữa.
2021-01-12 07:38:54.903330
12-January
691 phù hợp nhất với chúng tôi vì nó tải các tệp
2021-01-12 07:38:54.903330
12-January
09. Chúng tôi sẽ đề cập ngắn gọn về cách thức hoạt động của nó

NguồnFileLoader

Phương thức

2021-01-12 07:38:54.903330
12-January
600 của
2021-01-12 07:38:54.903330
12-January
691 luôn trả về
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

572. Điều này có nghĩa là
2021-01-12 07:38:54.903330
12-January
171 tự tạo đối tượng mô-đun mới và khởi tạo nó bằng cách sao chép các thuộc tính từ thông số kỹ thuật

Phương pháp

2021-01-12 07:38:54.903330
12-January
605 của
2021-01-12 07:38:54.903330
12-January
691 thực hiện chính xác những gì bạn mong đợi

>>> __name__
'__main__'
4

Nó gọi

2021-01-12 07:38:54.903330
12-January
816 để tạo một đối tượng mã từ tệp và sau đó gọi
2021-01-12 07:38:54.903330
12-January
817 để thực thi đối tượng mã trong không gian tên của mô-đun. Lưu ý rằng trước tiên,
2021-01-12 07:38:54.903330
12-January
816 sẽ cố đọc mã byte từ tệp
>>> __name__
'__main__'
60 trong thư mục
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

507 và tạo tệp này nếu nó chưa tồn tại

Đó là nó. Chúng tôi đã hoàn thành nghiên cứu của mình về công cụ tìm và trình tải và xem điều gì xảy ra trong quá trình nhập. Hãy tóm tắt những gì chúng ta đã học

Tóm tắt quy trình nhập khẩu

Bất kỳ câu lệnh nhập nào cũng biên dịch thành một loạt hướng dẫn mã byte, một trong số đó, được gọi là

2021-01-12 07:38:54.903330
12-January
110, nhập mô-đun bằng cách gọi hàm
>>> __name__
'__main__'
8 tích hợp. Nếu mô-đun được chỉ định bằng tên tương đối, trước tiên,
>>> __name__
'__main__'
8 sẽ phân giải tên tương đối thành tên tuyệt đối bằng cách sử dụng thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

567 của mô-đun hiện tại. Sau đó, nó tra cứu mô-đun trong
2021-01-12 07:38:54.903330
12-January
173 và trả về mô-đun nếu có. Nếu mô-đun không có ở đó,
>>> __name__
'__main__'
8 sẽ cố gắng tìm thông số kỹ thuật của mô-đun. Nó gọi phương thức
2021-01-12 07:38:54.903330
12-January
184 của mọi công cụ tìm được liệt kê trong
2021-01-12 07:38:54.903330
12-January
190 cho đến khi một số công cụ tìm trả về thông số kỹ thuật. Nếu mô-đun là mô-đun tích hợp,
2021-01-12 07:38:54.903330
12-January
195 trả về thông số kỹ thuật. Nếu mô-đun là mô-đun bị đóng băng,
2021-01-12 07:38:54.903330
12-January
196 trả về thông số kỹ thuật. Mặt khác,
2021-01-12 07:38:54.903330
12-January
197 tìm kiếm mô-đun trên đường dẫn tìm kiếm mô-đun, đó là thuộc tính
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

520 của mô-đun chính hoặc
>>> __name__
'__main__'
6 nếu thuộc tính trước không được xác định.
2021-01-12 07:38:54.903330
12-January
197 lặp lại các mục nhập đường dẫn và đối với mỗi mục nhập, gọi phương thức
2021-01-12 07:38:54.903330
12-January
184 của công cụ tìm mục nhập đường dẫn tương ứng. Để có công cụ tìm mục nhập đường dẫn tương ứng,
2021-01-12 07:38:54.903330
12-January
197 chuyển mục nhập đường dẫn tới các nội dung có thể gọi được liệt kê trong
2021-01-12 07:38:54.903330
12-January
636. Nếu mục nhập đường dẫn là một đường dẫn đến một thư mục, thì một trong các hàm có thể gọi được sẽ trả về một phiên bản
2021-01-12 07:38:54.903330
12-January
643 để tìm kiếm các mô-đun trong thư mục đó.
2021-01-12 07:38:54.903330
12-January
197 gọi nó là
2021-01-12 07:38:54.903330
12-January
184. Phương pháp
2021-01-12 07:38:54.903330
12-January
184 của
2021-01-12 07:38:54.903330
12-January
643 kiểm tra xem thư mục được chỉ định bởi mục nhập đường dẫn có chứa phần mở rộng C, tệp
2021-01-12 07:38:54.903330
12-January
09, tệp
>>> __name__
'__main__'
60 hoặc thư mục có tên khớp với tên mô-đun hay không. Nếu nó tìm thấy bất cứ thứ gì, nó sẽ tạo một thông số kỹ thuật mô-đun với trình tải tương ứng. Khi
>>> __name__
'__main__'
8 nhận được thông số kỹ thuật, nó gọi phương thức
2021-01-12 07:38:54.903330
12-January
600 của trình tải để tạo một đối tượng mô-đun và sau đó gọi phương thức
2021-01-12 07:38:54.903330
12-January
605 để thực thi mô-đun. Cuối cùng, nó đặt mô-đun vào
2021-01-12 07:38:54.903330
12-January
173 và trả về mô-đun

Bạn còn câu hỏi nào không?

Có gì trong hệ thống. đường dẫn?

Theo mặc định,

>>> __name__
'__main__'
6 bao gồm những điều sau đây

  1. Một thư mục hiện tại phụ thuộc vào lời gọi. Nếu bạn chạy một chương trình dưới dạng tập lệnh, thì đó là thư mục chứa tập lệnh. Nếu bạn chạy một chương trình dưới dạng một mô-đun bằng cách sử dụng công tắc
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    585, thì đó là thư mục mà bạn chạy tệp thực thi
    >>> __name__
    '__main__'
    
    61 từ đó. Nếu bạn chạy
    >>> __name__
    '__main__'
    
    61 ở chế độ tương tác hoặc thực hiện lệnh bằng khóa chuyển đổi
    2021-01-12 07:38:54.903330
    12-January
    853, thì mục nhập đầu tiên trong
    >>> __name__
    '__main__'
    
    6 sẽ là một chuỗi trống
  2. Các thư mục được chỉ định bởi biến môi trường
    2021-01-12 07:38:54.903330
    12-January
    855
  3. Một kho lưu trữ zip có chứa thư viện tiêu chuẩn, e. g.
    2021-01-12 07:38:54.903330
    12-January
    856. Nó được sử dụng để cài đặt nhúng. Cài đặt bình thường không bao gồm kho lưu trữ này
  4. Một thư mục chứa các mô-đun chuẩn được viết bằng Python, e. g.
    2021-01-12 07:38:54.903330
    12-January
    857
  5. Một thư mục chứa các phần mở rộng C tiêu chuẩn, e. g.
    2021-01-12 07:38:54.903330
    12-January
    858
  6. Các thư mục dành riêng cho trang được thêm vào bởi mô-đun
    dttime = __import__('datetime', globals(), locals(), [], 0)
    print(dttime.datetime.now())
    # Make a copy of dttime
    x = dttime.datetime.now()
    # Get your custom results
    print(x.strftime("%d-%B"))
    
    
    552, e. g.
    2021-01-12 07:38:54.903330
    12-January
    860. Đó là nơi các mô-đun của bên thứ ba được cài đặt bởi các công cụ như
    2021-01-12 07:38:54.903330
    12-January
    861 hoạt động

Để xây dựng các đường dẫn này, trước tiên Python xác định vị trí của tệp thực thi

>>> __name__
'__main__'
61. Nếu chúng ta chạy tệp thực thi bằng cách chỉ định một đường dẫn, Python đã biết vị trí. Nếu không, nó sẽ tìm kiếm tệp thực thi trong
2021-01-12 07:38:54.903330
12-January
863. Cuối cùng, nó nhận được một cái gì đó như
2021-01-12 07:38:54.903330
12-January
864. Sau đó, nó cố gắng tìm ra vị trí của các mô-đun tiêu chuẩn. Nó di chuyển một thư mục lên từ tệp thực thi cho đến khi tìm thấy tệp
2021-01-12 07:38:54.903330
12-January
865. Tệp này biểu thị thư mục chứa các mô-đun chuẩn được viết bằng Python. Quá trình tương tự được lặp lại để tìm thư mục chứa các phần mở rộng C tiêu chuẩn, nhưng thư mục
2021-01-12 07:38:54.903330
12-January
866 được sử dụng làm điểm đánh dấu lần này. Tệp
2021-01-12 07:38:54.903330
12-January
867 cùng với tệp thực thi hoặc một thư mục phía trên có thể chỉ định một thư mục khác để bắt đầu tìm kiếm từ đó. Và biến môi trường
2021-01-12 07:38:54.903330
12-January
868 có thể được sử dụng để chỉ định thư mục "cơ sở" để Python hoàn toàn không cần thực hiện tìm kiếm

Mô-đun tiêu chuẩn

dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

552 lấy thư mục "cơ sở" được tìm thấy trong quá trình tìm kiếm hoặc được chỉ định bởi
2021-01-12 07:38:54.903330
12-January
868 và thêm
2021-01-12 07:38:54.903330
12-January
871 vào thư mục đó để lấy thư mục chứa các mô-đun của bên thứ ba. Thư mục này có thể chứa các tệp cấu hình đường dẫn
2021-01-12 07:38:54.903330
12-January
872 yêu cầu
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

552 thêm các thư mục dành riêng cho trang web vào
>>> __name__
'__main__'
6. Các thư mục đã thêm cũng có thể chứa các tệp
2021-01-12 07:38:54.903330
12-January
872 để quá trình lặp lại theo cách đệ quy

Nếu tệp

2021-01-12 07:38:54.903330
12-January
867 tồn tại, thì
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

552 sử dụng thư mục chứa tệp này làm thư mục "cơ sở". Lưu ý rằng đây không phải là thư mục mà
2021-01-12 07:38:54.903330
12-January
867 chỉ định. Theo cơ chế này, Python hỗ trợ các môi trường ảo có các thư mục dành riêng cho trang web nhưng chia sẻ thư viện chuẩn với cài đặt toàn hệ thống. Kiểm tra các tài liệu trên
dttime = __import__('datetime', globals(), locals(), [], 0)
print(dttime.datetime.now())
# Make a copy of dttime
x = dttime.datetime.now()
# Get your custom results
print(x.strftime("%d-%B"))

552 và PEP 405 - Môi trường ảo Python để tìm hiểu thêm về điều này

Quá trình tính toán

>>> __name__
'__main__'
6 thậm chí còn phức tạp hơn. Nếu bạn muốn biết những sắc thái đó, hãy xem câu trả lời StackOverflow này

Phần kết luận

Nếu bạn hỏi tôi về khía cạnh dễ bị hiểu lầm nhất của Python, tôi sẽ trả lời mà không cần suy nghĩ kỹ. hệ thống nhập Python. Cho đến khi tôi viết bài này, tôi thực sự không thể nói chính xác mô-đun là gì; . Biết nói gì bây giờ? . Tôi đổ lỗi cho sự hiểu lầm của mình về các tài liệu đã đơn giản hóa thực tế như thế này

Một mô-đun là một tệp chứa các định nghĩa và câu lệnh Python

hoặc bỏ qua các chi tiết như thế này

Bạn có thể coi các gói là các thư mục trên một hệ thống tệp và các mô-đun là các tệp trong các thư mục, nhưng đừng hiểu sự tương tự này theo nghĩa đen vì các gói và mô-đun không cần bắt nguồn từ hệ thống tệp. Đối với mục đích của tài liệu này, chúng tôi sẽ sử dụng sự tương tự thuận tiện này của các thư mục và tệp

Nhập khẩu tương đối thực sự không trực quan, nhưng một khi bạn hiểu rằng chúng chỉ là một cách để chỉ định tên mô-đun liên quan đến tên gói hiện tại, bạn sẽ không gặp vấn đề gì với chúng

Công cụ tìm đường dẫn meta, công cụ tìm mục nhập đường dẫn, móc đường dẫn, mục nhập đường dẫn và trình tải làm cho hệ thống nhập phức tạp hơn nhưng cũng làm cho nó linh hoạt hơn. PEP 302 và PEP 451 đưa ra một số lý do cho sự đánh đổi này

Còn về

>>> __name__
'__main__'
6 thì sao? . Có lẽ, nó quá phức tạp để mô tả chính xác. Nhưng tôi nghĩ rằng giá trị gần đúng như giá trị chúng tôi đưa ra trong phần trước là đủ tốt cho các mục đích thực tế

Nhìn chung, nghiên cứu hệ thống nhập khẩu là hữu ích, nhưng tôi nghĩ rằng lần sau chúng ta nên nghiên cứu một cái gì đó thú vị hơn. Làm thế nào về không đồng bộ/chờ đợi?


Nếu bạn có bất kỳ câu hỏi, nhận xét hoặc đề xuất nào, vui lòng liên hệ với tôi theo địa chỉ victor@tenthousandmeters. com

Làm cách nào để sử dụng importlib trong Python?

import_module(tên, gói=Không). Tên của mô-đun được nhập được chuyển thành tham số đầu tiên cho chức năng này. Trong trường hợp tên của mô-đun được chỉ định theo thuật ngữ tương đối, tham số gói cũng có thể được sử dụng. Nó trả về một đối tượng mô-đun có thể được liên kết với bất kỳ biến nào.

Làm cách nào để nhập tệp bằng Python?

Nếu bạn có tệp python của riêng mình muốn nhập, bạn có thể sử dụng câu lệnh nhập như sau. >>> nhập my_file # giả sử bạn có tệp my_file. py trong thư mục hiện tại. # Đối với các tệp trong các thư mục khác, hãy cung cấp đường dẫn đến tệp đó, tuyệt đối hoặc tương đối.

Làm cách nào để nhập thư viện động trong Python?

Sử dụng import_module từ gói importlib . Bạn phải cung cấp một chuỗi đại diện cho moduleName.

Làm cách nào để nhập mô-đun có đường dẫn trong Python?

Có nhiều phương pháp khác nhau có thể được sử dụng để nhập mô-đun bằng cách sử dụng đường dẫn đầy đủ của mô-đun. .
sử dụng sys. đường dẫn. chức năng nối thêm ()
Sử dụng gói importlib
Sử dụng lớp SourceFileLoader