Hướng dẫn python empty __init__ - python trống __init__

Đã hỏi 13 năm, 10 tháng trước 13 years, 10 months ago

Show

Đã xem 2,0m lần 2.0m times

import spam
5 cho trong thư mục nguồn Python là gì?

Hướng dẫn python empty __init__ - python trống __init__

Mateen Ulhaq

22.6K16 Huy hiệu vàng86 Huy hiệu bạc128 Huy hiệu đồng16 gold badges86 silver badges128 bronze badges

hỏi ngày 15 tháng 1 năm 2009 lúc 20:09Jan 15, 2009 at 20:09

6

Nó từng là một phần bắt buộc của gói (gói cũ, trước 3,3 "thường xuyên", không phải là "gói tên gọi tên" mới hơn 3,3+).

Đây là tài liệu.

Python xác định hai loại gói, gói thông thường và gói tên. Các gói thông thường là các gói truyền thống khi chúng tồn tại trong Python 3.2 trở lên. Một gói thông thường thường được triển khai dưới dạng thư mục chứa tệp

import spam
5. Khi một gói thông thường được nhập, tệp
import spam
5 này được thực thi hoàn toàn và các đối tượng mà nó xác định bị ràng buộc với tên trong không gian tên gói. Tệp
import spam
5 có thể chứa cùng một mã Python mà bất kỳ mô -đun nào khác có thể chứa và Python sẽ thêm một số thuộc tính bổ sung vào mô -đun khi được nhập.

Nhưng chỉ cần nhấp vào liên kết, nó chứa một ví dụ, thêm thông tin và giải thích về các gói không gian tên, loại gói mà không có

import spam
5.

SMCI

30.8K18 Huy hiệu vàng111 Huy hiệu bạc146 Huy hiệu đồng18 gold badges111 silver badges146 bronze badges

Đã trả lời ngày 15 tháng 1 năm 2009 lúc 20:13Jan 15, 2009 at 20:13

LokilokiLoki

29K9 Huy hiệu vàng47 Huy hiệu bạc62 Huy hiệu Đồng9 gold badges47 silver badges62 bronze badges

4

Các tệp có tên

import spam
5 được sử dụng để đánh dấu các thư mục trên đĩa là thư mục gói Python. Nếu bạn có các tệp

mydir/spam/__init__.py
mydir/spam/module.py

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
1 là trên đường dẫn của bạn, bạn có thể nhập mã trong
database/
    __init__.py
    schema.py
    insertions.py
    queries.py
2 dưới dạng

import spam.module

hoặc

from spam import module

Nếu bạn xóa tệp

import spam
5, Python sẽ không còn tìm kiếm các mô hình con bên trong thư mục đó, vì vậy cố gắng nhập mô -đun sẽ không thành công.

Tệp

import spam
5 thường trống, nhưng có thể được sử dụng để xuất các phần được chọn của gói dưới tên thuận tiện hơn, giữ các hàm tiện lợi, v.v.

import spam

dựa vào cái này

Shaido

26.5K21 Huy hiệu vàng68 Huy hiệu bạc72 Huy hiệu đồng21 gold badges68 silver badges72 bronze badges

Đã trả lời ngày 7 tháng 11 năm 2010 lúc 3:31Nov 7, 2010 at 3:31

Caritoscaritoscaritos

12.1k2 Huy hiệu vàng16 Huy hiệu bạc15 Huy hiệu đồng2 gold badges16 silver badges15 bronze badges

3

Ngoài việc dán nhãn thư mục là gói Python và xác định

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
5,
import spam
5 cho phép bạn xác định bất kỳ biến nào ở cấp gói. Làm như vậy thường thuận tiện nếu một gói định nghĩa một cái gì đó sẽ được nhập thường xuyên, theo kiểu giống như API. Mô hình này thúc đẩy việc tuân thủ các "căn hộ" tốt hơn triết lý lồng nhau ".
import spam
5 allows you to define any variable at the package level.
Doing so is often convenient if a package defines something that will be imported frequently, in an API-like fashion. This pattern promotes adherence to the Pythonic "flat is better than nested" philosophy.

Một ví dụ

Dưới đây là một ví dụ từ một trong các dự án của tôi, trong đó tôi thường xuyên nhập

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
7 gọi là
database/
    __init__.py
    schema.py
    insertions.py
    queries.py
8 để tương tác với cơ sở dữ liệu của mình. Tôi đã viết gói "cơ sở dữ liệu" với một vài mô -đun:

database/
    __init__.py
    schema.py
    insertions.py
    queries.py

import spam
5 của tôi chứa mã sau:

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

Vì tôi xác định

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
8 ở đây, tôi có thể bắt đầu một phiên mới bằng cú pháp dưới đây. Mã này sẽ giống nhau được thực hiện từ bên trong hoặc bên ngoài thư mục gói "cơ sở dữ liệu".

from database import Session
session = Session()

Tất nhiên, đây là một sự tiện lợi nhỏ - thay thế sẽ là xác định

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
8 trong một tệp mới như "create_session.py" trong gói cơ sở dữ liệu của tôi và bắt đầu các phiên mới bằng cách sử dụng:

from database.create_session import Session
session = Session()

đọc thêm

Có một chủ đề Reddit khá thú vị bao gồm các ứng dụng thích hợp của

import spam
5 tại đây:

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

Ý kiến ​​đa số dường như là các tệp

import spam
5 nên rất mỏng để tránh vi phạm "rõ ràng tốt hơn so với triết lý ngầm".

Đã trả lời ngày 24 tháng 9 năm 2013 lúc 10:38Sep 24, 2013 at 10:38

Hướng dẫn python empty __init__ - python trống __init__

Nathan Gouldnathan GouldNathan Gould

7.5952 Huy hiệu vàng16 Huy hiệu bạc15 Huy hiệu đồng2 gold badges16 silver badges15 bronze badges

3

Có 2 lý do chính cho

import spam
5

  1. Để thuận tiện: Người dùng khác sẽ không cần biết vị trí chính xác của chức năng của bạn trong hệ thống phân cấp gói (tài liệu) của bạn.

    your_package/
      __init__.py
      file1.py
      file2.py
        ...
      fileN.py
    
    # in __init__.py
    from .file1 import *
    from .file2 import *
    ...
    from .fileN import *
    
    import spam.module
    
    0

    sau đó những người khác có thể gọi thêm () bởi

    import spam.module
    
    1

    mà không biết các chức năng bên trong của File1, như

    import spam.module
    
    2
  2. Nếu bạn muốn một cái gì đó được khởi tạo; Ví dụ: ghi nhật ký (nên được đặt ở cấp cao nhất):

    import spam.module
    
    3

Rajat Jain

1.2632 huy hiệu vàng16 Huy hiệu bạc28 Huy hiệu đồng2 gold badges16 silver badges28 bronze badges

Đã trả lời ngày 8 tháng 4 năm 2015 lúc 8:29Apr 8, 2015 at 8:29

flyceflyceeflycee

10,9k3 Huy hiệu vàng18 Huy hiệu bạc14 Huy hiệu đồng3 gold badges18 silver badges14 bronze badges

4

Tệp

import spam
5 làm cho các thư mục xử lý Python chứa nó dưới dạng các mô -đun.

Hơn nữa, đây là tệp đầu tiên được tải trong một mô -đun, vì vậy bạn có thể sử dụng nó để thực thi mã mà bạn muốn chạy mỗi khi một mô -đun được tải hoặc chỉ định các mô hình con được xuất.

Đã trả lời ngày 15 tháng 1 năm 2009 lúc 20:22Jan 15, 2009 at 20:22

Berk Güdercan có thể Berk GüderCan Berk Güder

107K25 Huy hiệu vàng129 Huy hiệu bạc136 Huy hiệu đồng25 gold badges129 silver badges136 bronze badges

2

Vì Python 3.3,

import spam
5 không còn cần phải xác định các thư mục là các gói Python có thể nhập.

Kiểm tra PEP 420: Gói không gian tên ngầm:

Hỗ trợ bản địa cho các thư mục gói mà don lồng yêu cầu các tệp đánh dấu

import spam
5 và có thể tự động mở rộng nhiều phân đoạn đường dẫn (lấy cảm hứng từ các cách tiếp cận của bên thứ ba khác nhau đối với các gói không gian tên, như được mô tả trong PEP 420)

Đây là bài kiểm tra:

import spam.module
4

Tài liệu tham khảo: https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-maces PY không cần thiết cho các gói trong Python 3?
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
Is __init__.py not required for packages in Python 3?

Đã trả lời ngày 12 tháng 10 năm 2016 lúc 6:36Oct 12, 2016 at 6:36

zeekvfuzeekvfuzeekvfu

3.2771 Huy hiệu vàng20 Huy hiệu bạc19 Huy hiệu đồng1 gold badge20 silver badges19 bronze badges

3

Mặc dù Python hoạt động mà không có tệp

import spam
5, bạn vẫn nên bao gồm một tệp.

Nó chỉ định rằng thư mục nên được coi là một gói, do đó bao gồm nó (ngay cả khi nó trống).

Ngoài ra còn có một trường hợp bạn thực sự có thể sử dụng tệp

import spam
5:

Hãy tưởng tượng bạn đã có cấu trúc tệp sau:

import spam.module
5

from database import Session
session = Session()
0 chứa điều này:

import spam.module
6

Để sử dụng

from database import Session
session = Session()
1, bạn sẽ cần một trong những điều sau đây:

import spam.module
7

Có thể ở đó bạn cần (hoặc muốn) giữ

from database import Session
session = Session()
0 bên trong
from database import Session
session = Session()
3 (ví dụ: Runtimes/Sextences) nhưng bạn chỉ muốn nhập
from database import Session
session = Session()
3.


Nếu bạn đã thay đổi tên của

from database import Session
session = Session()
0 thành
import spam
5 thì bạn có thể sử dụng
from database import Session
session = Session()
1 bằng cách chỉ nhập
from database import Session
session = Session()
3:

import spam.module
8

Điều này hoạt động vì

import spam
5 được coi là một phần của gói.


Một số gói Python thực sự làm điều này. Một ví dụ là với JSON, trong đó chạy

from database.create_session import Session
session = Session()
0 thực sự đang nhập
import spam
5 từ gói
from database.create_session import Session
session = Session()
2 (xem cấu trúc tệp gói ở đây):

Mã nguồn:

from database.create_session import Session
session = Session()
3
from database.create_session import Session
session = Session()
3

Hướng dẫn python empty __init__ - python trống __init__

Đã trả lời ngày 12 tháng 5 năm 2018 lúc 15:41May 12, 2018 at 15:41

Hướng dẫn python empty __init__ - python trống __init__

XantiumxantiumXantium

10,7k10 Huy hiệu vàng60 Huy hiệu bạc87 Huy hiệu đồng10 gold badges60 silver badges87 bronze badges

Trong Python, định nghĩa của gói rất đơn giản. Giống như Java, cấu trúc phân cấp và cấu trúc thư mục là như nhau. Nhưng bạn phải có

import spam
5 trong một gói. Tôi sẽ giải thích tệp
import spam
5 với ví dụ dưới đây:

import spam.module
9

import spam
5 có thể trống, miễn là nó tồn tại. Nó chỉ ra rằng thư mục nên được coi là một gói. Tất nhiên,
import spam
5 cũng có thể đặt nội dung thích hợp.

Nếu chúng ta thêm một hàm trong module_n1:

from spam import module
0

Sau khi chạy:

from spam import module
1

Sau đó, chúng tôi làm theo gói phân cấp và được gọi là MODULE_N1 hàm. Chúng ta có thể sử dụng

import spam
5 trong Subpackage_B như thế này:

from spam import module
2

Sau khi chạy:

from spam import module
3

Do đó, sử dụng * nhập, gói mô -đun phải tuân theo nội dung

import spam
5.

Đã trả lời ngày 9 tháng 1 năm 2014 lúc 11:45Jan 9, 2014 at 11:45

Marcus Thorntonmarcus ThorntonMarcus Thornton

5.7395 huy hiệu vàng46 Huy hiệu bạc49 Huy hiệu đồng5 gold badges46 silver badges49 bronze badges

2

import spam
5 sẽ coi thư mục nó là một mô -đun có thể tải.

Đối với những người thích đọc mã, tôi đặt bình luận của nhà giả kim hai bit ở đây.

from spam import module
4

Đã trả lời ngày 3 tháng 1 năm 2015 lúc 17:41Jan 3, 2015 at 17:41

Hướng dẫn python empty __init__ - python trống __init__

B.Mr.W.B.Mr.W.B.Mr.W.

18.1K33 Huy hiệu vàng111 Huy hiệu bạc166 Huy hiệu đồng33 gold badges111 silver badges166 bronze badges

0

Nó tạo điều kiện nhập các tệp Python khác. Khi bạn đặt tệp này vào một thư mục (nói) chứa các tệp PY khác, thì bạn có thể làm một cái gì đó như nhập công cụ.

from spam import module
5

Nếu không có

import spam
5 bên trong các công cụ thư mục, bạn không thể nhập bản khác, vì Python không biết mã nguồn cho công cụ ở đâu và không thể nhận ra nó là một gói.

Matt Fenwick

47.4K21 Huy hiệu vàng125 Huy hiệu bạc191 Huy hiệu Đồng21 gold badges125 silver badges191 bronze badges

Đã trả lời ngày 15 tháng 1 năm 2009 lúc 20:18Jan 15, 2009 at 20:18

EpitaphePitaphEpitaph

3.07810 Huy hiệu vàng33 Huy hiệu bạc43 Huy hiệu đồng10 gold badges33 silver badges43 bronze badges

0

Một tệp

import spam
5 giúp nhập khẩu dễ dàng. Khi có
import spam
5 có trong gói, chức năng
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
4 có thể được nhập từ tệp
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
5 như vậy:

from spam import module
6

Tuy nhiên, không có nó, bạn không thể nhập trực tiếp. Bạn phải sửa đổi đường dẫn hệ thống:

from spam import module
7

Đã trả lời ngày 25 tháng 5 năm 2019 lúc 2:42May 25, 2019 at 2:42

Hướng dẫn python empty __init__ - python trống __init__

AlecalecAlec

7.5907 Huy hiệu vàng30 Huy hiệu bạc59 Huy hiệu Đồng7 gold badges30 silver badges59 bronze badges

0

Một điều __init__.py cho phép chuyển đổi một mô -đun thành một gói mà không phá vỡ API hoặc tạo không gian tên lồng nhau hoặc các mô -đun riêng*. Điều này giúp khi tôi muốn mở rộng một không gian tên.

Nếu tôi có một tệp Util.py chứa

from spam import module
8

sau đó người dùng sẽ truy cập

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
6 với

from spam import module
9

Nếu sau đó tôi muốn thêm các chức năng tiện ích cho tương tác cơ sở dữ liệu và tôi muốn chúng có không gian tên riêng của chúng theo

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
7, tôi sẽ cần một thư mục mới ** và để giữ khả năng tương thích API (để
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
8 vẫn hoạt động), tôi sẽ Gọi nó là UTIL/. Tôi có thể chuyển Util.py vào Util/ Like SO,

import spam
0

và trong Util/__ init__.py do

import spam
1

Nhưng điều này là dư thừa. Thay vì có tệp UTIL/UTIL.PY, chúng ta chỉ có thể đặt nội dung Util.py vào __init__.py và người dùng có thể bây giờ có thể

import spam
2

Tôi nghĩ rằng điều này nổi bật một cách độc đáo cách

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
7 của gói __init__.py hoạt động theo cách tương tự như mô -đun
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
7

* Điều này được gợi ý trong các câu trả lời khác, nhưng tôi muốn làm nổi bật nó ở đây ** Không sử dụng thể dục dụng cụ nhập khẩu. Lưu ý rằng nó sẽ không hoạt động để tạo một gói mới có cùng tên với tệp, xem cái này
** short of employing import gymnastics. Note it won't work to create a new package with the same name as the file, see this

Đã trả lời ngày 19 tháng 7 năm 2020 lúc 21:37Jul 19, 2020 at 21:37

Joeljoeljoel

5.6062 Huy hiệu vàng30 Huy hiệu bạc46 Huy hiệu đồng2 gold badges30 silver badges46 bronze badges

2

Nếu bạn đang sử dụng Python 2 và muốn tải anh chị em của tệp của mình, bạn chỉ cần thêm thư mục chính của tệp vào đường dẫn hệ thống của bạn. Nó sẽ hoạt động giống như khi tệp hiện tại của bạn là một tệp init.

import spam
3

Sau đó, nhập khẩu thường xuyên liên quan đến thư mục của tệp sẽ hoạt động tốt. Ví dụ.

import spam
4

Mặc dù vậy, bạn muốn sử dụng tệp init.py thích hợp, nhưng khi xử lý mã di sản, bạn có thể bị mắc kẹt với F.EX. Một thư viện được mã hóa cứng để tải một tệp cụ thể và không có gì ngoài. Đối với những trường hợp đó là một thay thế.init.py file instead though, but when dealing with legacy code you might be stuck with f.ex. a library hard-coded to load a particular file and nothing but. For those cases this is an alternative.

Đã trả lời ngày 14 tháng 7 lúc 13:24Jul 14 at 13:24

init.py: Đây là một tệp Python được tìm thấy trong thư mục gói, nó được gọi khi gói hoặc mô -đun trong gói được nhập. Bạn có thể sử dụng điều này để thực thi mã khởi tạo gói, tức là bất cứ khi nào gói được nhập, các câu lệnh Python được thực thi trước khi các mô -đun khác trong thư mục này được thực thi. Nó tương tự như chức năng chính của chương trình C hoặc Java nhưng điều này tồn tại trong mô -đun gói Python (thư mục) thay vì trong tệp Python cốt lõi. Ngoài ra, nó có quyền truy cập vào các biến toàn cầu được xác định trong tệp init.py này như khi mô -đun được nhập vào tệp Python..py : It is a python file found in a package directory, it is invoked when the package or a module in the package is imported. You can use this to execute package initialization code, i.e. whenever the package is imported the python statements are executed first before the other modules in this folder gets executed. It is similar to main function of c or java program but this exists in the python package module(folder) rather than in the core python file. also it has access to global variables defined in this init.py file as when the module is imported into python file.

ví dụ như ví dụ. Tôi có một tệp init.py trong một thư mục có tên pymodlib, tệp này chứa các câu lệnh sau:init.py file in a folder called pymodlib, this file contains the following statements:

in (f'invoking init.py cho {name} ') pystructure = [' for_loop ',' while__loop ',' ifcondition ']]]]init.py for {name}') pystructures = ['for_loop', 'while__loop', 'ifCondition']

Khi tôi nhập gói này "pymodlib" trong mô -đun giải pháp hoặc bảng điều khiển Python của giải pháp của tôi: hai câu lệnh này được thực thi trong khi nhập. Vì vậy, trong nhật ký hoặc bảng điều khiển, bạn sẽ thấy đầu ra sau:

Nhập pymodlib gọi init.py cho pymodlibinit.py for pymodlib

Trong tuyên bố tiếp theo của bảng điều khiển Python: Tôi có thể truy cập biến toàn cầu:

pymodlib.pystructure Nó cung cấp cho đầu ra sau:

['for_loop', 'trong khi__Loop', 'ifcondition']]]

Bây giờ từ Python3.3 trở đi, việc sử dụng tệp này là tùy chọn để biến thư mục thành một mô -đun Python. Vì vậy, bạn bỏ qua từ bao gồm nó trong thư mục mô -đun Python.

Đã trả lời ngày 4 tháng 4 lúc 18:35Apr 4 at 18:35