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 Show
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
Ví dụ 1 90 91 92 93 94 95 96 97 890 891 892 923 924 97 926 927 894 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ápCú 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 raChạ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ư 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ôiTrướ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 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 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 8 hoạt động. Đi nàoMô-đun và đối tượng mô-đunHã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 2 tìm kiếm một mô-đun có tên 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àyMô-đ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 4), vì vậy chúng tôi có thể truy cập chúng dưới dạng thuộc tínhNế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ừ 5dttime = __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 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ôiPython 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ư 7 hoặc 8. Loại đối tượng mô-đun là 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-January00 2021-01-12 07:38:54.903330 12-January1 Mô-đun 2021-01-12 07:38:54.903330 12-January00 định nghĩa 2021-01-12 07:38:54.903330 12-January02 như thế nào? . Chúng ta cũng có thể làm được 2021-01-12 07:38:54.903330 12-January6 Cho dù chúng tôi có được 2021-01-12 07:38:54.903330 12-January02 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-January8 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-January9 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-January06 thường được sử dụng để lấy tên của mô-đun hiện tại
Lưu ý rằng 2021-01-12 07:38:54.903330 12-January06 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
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-January08 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 nhauTheo mặc định, Python nhận ra những thứ sau đây là mô-đun
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 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 62 lưu trữ tên của họ2021-01-12 07:38:54.903330 12-January0 Các mô-đun bị đóng băng cũng là một phần của tệp thực thi 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à 64 và 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ácCá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 66, 67 và 68 là phần mở rộng của C. Nhiều người khác bao gồm 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 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-January09, trước tiên, nó sẽ tìm kiếm tệp 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 60 không tồn tại, Python sẽ biên dịch mã và tạo tệpTuy nhiên, chúng tôi sẽ không gọi các mô-đun tệp 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ể 6Để tìm hiểu thêm về các tệp 60, hãy xem PEP 3147 -- PYC Repository Directories và PEP 552 -- Deterministic pycsNhư 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óiNế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 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ì 6gói thông thườngThư 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 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ênTrướ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 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ô-đunBê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 7, như vậydttime = __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-January10 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-January11 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ệnNế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-January12 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 đốiCho đế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 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-January13 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-January06). 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-January14 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-January15 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-January16 Python sẽ báo lỗi 2021-01-12 07:38:54.903330 12-January17 Đ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-January18 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-January08 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ô-đunCá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-January19 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-January09 thông thường, thì mã sẽ được thực thi trong mô-đun 2021-01-12 07:38:54.903330 12-January08 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ẩuNế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 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àmPython cho phép chúng tôi đặt 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-January60 Bạn hiếm khi thấy mọi người ghi đè 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 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 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 8 như thế nàoNhập khẩu đơn giảnNhớ lại rằng một đoạn mã Python được thực thi theo hai bước
Để 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-January104 Để lấy mã byte, chúng tôi sử dụng mô-đun chuẩn 2021-01-12 07:38:54.903330 12-January105 2021-01-12 07:38:54.903330 12-January61 Lệnh 2021-01-12 07:38:54.903330 12-January106 đầu tiên đẩy 2021-01-12 07:38:54.903330 12-January107 lên ngăn xếp giá trị. 2021-01-12 07:38:54.903330 12-January106 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-January110 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-January111 gán giá trị trên cùng của ngăn xếp giá trị cho biến 0Đoạn mã thực thi lệnh 2021-01-12 07:38:54.903330 12-January110 như sau 2021-01-12 07:38:54.903330 12-January62 Tất cả các hành động xảy ra trong hàm 2021-01-12 07:38:54.903330 12-January114. Nó gọi 8 để thực hiện công việc, nhưng nếu 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-January118. Đây là cách logic này được triển khai trong mã 2021-01-12 07:38:54.903330 12-January63 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-January65 ý 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-January66 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 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-January121, và câu lệnh 7 vượt qua không trống 2021-01-12 07:38:54.903330 12-January123 Bây giờ chúng ta hãy thể hiện các câu lệnh nhập khác qua 8 như chúng ta đã thể hiện 2 nhưng lần này nhanh hơn nhiềuNhập mô-đun contuyên bố này 2021-01-12 07:38:54.903330 12-January67 biên dịch thành mã byte sau 2021-01-12 07:38:54.903330 12-January68 và tương đương với đoạn mã sau 2021-01-12 07:38:54.903330 12-January69 Các đối số của 8 được truyền giống như trong trường hợp của 2. Điểm khác biệt duy nhất là VM gán kết quả của 8 không phải cho tên của mô-đun (2021-01-12 07:38:54.903330 12-January129 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, 8 trả về mô-đun cấp cao nhất trong trường hợp nàytừ nhập khẩutuyên bố này 2021-01-12 07:38:54.903330 12-January80 biên dịch thành mã byte sau 2021-01-12 07:38:54.903330 12-January81 và tương đương với đoạn mã sau 2021-01-12 07:38:54.903330 12-January82 Tên để nhập được thông qua là 2021-01-12 07:38:54.903330 12-January123. Khi 2021-01-12 07:38:54.903330 12-January123 không trống, 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-January83 biên dịch thành mã byte sau 2021-01-12 07:38:54.903330 12-January84 và tương đương với đoạn mã sau 2021-01-12 07:38:54.903330 12-January85 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ì 8 sẽ cố gắng nhập chúng dưới dạng mô hình conNhập khẩu tương đốituyên bố này 2021-01-12 07:38:54.903330 12-January86 biên dịch thành mã byte sau 2021-01-12 07:38:54.903330 12-January87 và tương đương với đoạn mã sau 2021-01-12 07:38:54.903330 12-January88 Đối số 2021-01-12 07:38:54.903330 12-January121 cho biết 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-January141, nên 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 8 vì nó được thông qua với 2021-01-12 07:38:54.903330 12-January146 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 8Bên trong __import__()Khi tôi học cách chuẩn bị bài viết này, nghiên cứu 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àngThuật toán mà 8 thực hiện có thể được tóm tắt như sau
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, 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-January161. 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ì 8 sẽ cố gắng suy ra gói hiện tại từ 2021-01-12 07:38:54.903330 12-January06. 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-January167 để 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-January89 Sau khi kiểm tra, tên họ hàng được giải quyết 2021-01-12 07:38:54.903330 12-January90 Và 8 gọi 2021-01-12 07:38:54.903330 12-January171 để nhập mô-đun Quy trình nhập khẩuHàm 2021-01-12 07:38:54.903330 12-January171 lấy tên mô-đun tuyệt đối và thực hiện các bước sau
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-January173. 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-January171 kiểm tra 2021-01-12 07:38:54.903330 12-January173 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-January181 ở cuối bước 5 Nếu mô-đun không có trong 2021-01-12 07:38:54.903330 12-January173, thì 2021-01-12 07:38:54.903330 12-January171 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ảiCô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-January184 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-January186 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-January188. 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-January171 lặp lại các công cụ tìm được liệt kê trong 2021-01-12 07:38:54.903330 12-January190 và gọi 2021-01-12 07:38:54.903330 12-January184 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-January171 tăng 2021-01-12 07:38:54.903330 12-January177 Theo mặc định, 2021-01-12 07:38:54.903330 12-January190 lưu trữ ba công cụ tìm
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-January197. 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-January171 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-January600 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-January600 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-January171 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-January91 Sau khi tạo đối tượng mô-đun, 2021-01-12 07:38:54.903330 12-January171 thực thi mô-đun bằng cách gọi phương thức 2021-01-12 07:38:54.903330 12-January605 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-January92 Đ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-January173 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-January93 2021-01-12 07:38:54.903330 12-January94 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-January95 Đ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-January609 được thực thi. Vì vậy, nếu chúng ta sử dụng 2021-01-12 07:38:54.903330 12-January610 trong 2021-01-12 07:38:54.903330 12-January609 2021-01-12 07:38:54.903330 12-January96 chúng tôi nhận được một lỗi 2021-01-12 07:38:54.903330 12-January97 Thứ hai, một mô-đun bị xóa khỏi 2021-01-12 07:38:54.903330 12-January173 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-January173 Cuối cùng, mô-đun trong 2021-01-12 07:38:54.903330 12-January173 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-January173 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-January171 và 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àoBuildinImporter và FrozenImporterNhư chúng ta có thể đánh giá từ cái tên, 2021-01-12 07:38:54.903330 12-January195 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-January184 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-January600 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-January98 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-January196 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-January99 Sự khác biệt với 2021-01-12 07:38:54.903330 12-January195 là 2021-01-12 07:38:54.903330 12-January600 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-January605 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ẫn2021-01-12 07:38:54.903330 12-January197 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-January628 thành 2021-01-12 07:38:54.903330 12-January184 hoặc 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-January197 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-January197 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-January184 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-January197 gọi các hook đường dẫn được liệt kê trong 2021-01-12 07:38:54.903330 12-January636. 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-January637, trong trường hợp đó, 2021-01-12 07:38:54.903330 12-January197 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-January197 lưu trữ kết quả trong từ điển 2021-01-12 07:38:54.903330 12-January640 để á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-January636 chứa hai móc đường dẫn
Phiên bản 2021-01-12 07:38:54.903330 12-January642 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-January643 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-January642 trong tài liệu và trong PEP 273. Phiên bản 2021-01-12 07:38:54.903330 12-January643 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-January197 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-January197 ghi nhớ thuộc tính 2021-01-12 07:38:54.903330 12-January650 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-January650 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-January197, đây là thuật toán hoàn chỉnh mà 2021-01-12 07:38:54.903330 12-January184 của nó thực hiện
Tất cả logic phức tạp này của 2021-01-12 07:38:54.903330 12-January197 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-January197 gọi phương thức 2021-01-12 07:38:54.903330 12-January184 của một thể hiện 2021-01-12 07:38:54.903330 12-January643 được trả về bởi hook tương ứng Trình tìm tệpPhiên bản 2021-01-12 07:38:54.903330 12-January643 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-January184 của 2021-01-12 07:38:54.903330 12-January643 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 0Sau đó, 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-January682 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-January685 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-January687, 2021-01-12 07:38:54.903330 12-January688 và 2021-01-12 07:38:54.903330 12-January689. 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
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-January197 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-January184 thực hiện có thể được tóm tắt như sau
Một thông số gói thông thường được tạo như thế này 1một thông số tập tin như thế này 2và một gói không gian tên như thế này 3Khi 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-January690 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-January693 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-January691 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-January09. Chúng tôi sẽ đề cập ngắn gọn về cách thức hoạt động của nó NguồnFileLoaderPhương thức 2021-01-12 07:38:54.903330 12-January600 của 2021-01-12 07:38:54.903330 12-January691 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-January171 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-January605 của 2021-01-12 07:38:54.903330 12-January691 thực hiện chính xác những gì bạn mong đợi 4Nó gọi 2021-01-12 07:38:54.903330 12-January816 để tạo một đối tượng mã từ tệp và sau đó gọi 2021-01-12 07:38:54.903330 12-January817 để 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-January816 sẽ cố đọc mã byte từ tệp 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ẩuBấ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-January110, nhập mô-đun bằng cách gọi hàm 8 tích hợp. Nếu mô-đun được chỉ định bằng tên tương đối, trước tiên, 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-January173 và trả về mô-đun nếu có. Nếu mô-đun không có ở đó, 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-January184 của mọi công cụ tìm được liệt kê trong 2021-01-12 07:38:54.903330 12-January190 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-January195 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-January196 trả về thông số kỹ thuật. Mặt khác, 2021-01-12 07:38:54.903330 12-January197 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 6 nếu thuộc tính trước không được xác định. 2021-01-12 07:38:54.903330 12-January197 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-January184 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-January197 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-January636. 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-January643 để tìm kiếm các mô-đun trong thư mục đó. 2021-01-12 07:38:54.903330 12-January197 gọi nó là 2021-01-12 07:38:54.903330 12-January184. Phương pháp 2021-01-12 07:38:54.903330 12-January184 của 2021-01-12 07:38:54.903330 12-January643 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-January09, tệp 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 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-January600 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-January605 để thực thi mô-đun. Cuối cùng, nó đặt mô-đun vào 2021-01-12 07:38:54.903330 12-January173 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, 6 bao gồm những điều sau đây
Để 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 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-January863. Cuối cùng, nó nhận được một cái gì đó như 2021-01-12 07:38:54.903330 12-January864. 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-January865. 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-January866 đượ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-January867 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-January868 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-January868 và thêm 2021-01-12 07:38:54.903330 12-January871 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-January872 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 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-January872 để quá trình lặp lại theo cách đệ quy Nếu tệp 2021-01-12 07:38:54.903330 12-January867 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-January867 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 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àyPhần kết luậnNế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
hoặc bỏ qua các chi tiết như thế này
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ề 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 |