Hướng dẫn __init__.py python - __init__.py python

answer

1174

Đây là một phần của gói. Đây là tài liệu.Đây là tài liệu.

Python định nghĩa hai loại gói, gói thông thường và gói không gian 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ở về trước. Một gói thông thường thường được thực hiện như một thư mục chứa một

from spam import module
3tệp. Khi một gói thông thường được nhập,
from spam import module
3tệp này được thực thi ngầm và các đối tượng mà nó xác định được liên kết với các tên trong không gian tên của gói. Các
from spam import module
3tập tin có thể chứa mã Python tương tự mà bất kỳ thành phần khác có thể chứa, và Python sẽ bổ sung thêm một số thuộc tính bổ sung cho các mô-đun khi nó được nhập khẩu.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ở về trước. Một gói thông thường thường được thực hiện như một thư mục chứa một
from spam import module
3tệp. Khi một gói thông thường được nhập,
from spam import module
3tệp này được thực thi ngầm và các đối tượng mà nó xác định được liên kết với các tên trong không gian tên của gói. Các
from spam import module
3tập tin có thể chứa mã Python tương tự mà bất kỳ thành phần khác có thể chứa, và Python sẽ bổ sung thêm một số thuộc tính bổ sung cho các mô-đun khi nó được nhập khẩu.

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 không có

from spam import module
3.
from spam import module
3.

1174 hữu ích 5 bình luận chia sẻ 5 bình luận chia sẻ

answer

685

Các tệp có tên

from spam import module
3được sử dụng để đánh dấu các thư mục trên đĩa dưới dạng các thư mục gói Python. Nếu bạn có các tập tin
from spam import module
3được sử dụng để đánh dấu các thư mục trên đĩa dưới dạng các thư mục gói Python. Nếu bạn có các tập tin

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

from spam import module
8trên đường dẫn của bạn, bạn có thể nhập mã
from spam import module
9dưới dạng
from spam import module
8trên đường dẫn của bạn, bạn có thể nhập mã
from spam import module
9dưới dạng

import spam.module

hoặc là

from spam import module

Nếu bạn xóa

from spam import module
3tệp, Python sẽ không còn tìm các mô đun con trong thư mục đó nữa, vì vậy các nỗ lực nhập mô-đun sẽ thất bại.
from spam import module
3tệp, Python sẽ không còn tìm các mô đun con trong thư mục đó nữa, vì vậy các nỗ lực nhập mô-đun sẽ thất bại.

Các

from spam import module
3tập tin thường là trống rỗng, nhưng có thể được sử dụng để xuất khẩu phần chọn của gói dưới tên thuận tiện hơn, giữ chức năng tiện nghi, vv Cho ví dụ trên, nội dung của các mô-đun init có thể được truy cập như
from spam import module
3tập tin thường là trống rỗng, nhưng có thể được sử dụng để xuất khẩu phần chọn của gói dưới tên thuận tiện hơn, giữ chức năng tiện nghi, vv Cho ví dụ trên, nội dung của các mô-đun init có thể được truy cập như

import spam

dựa trên điều nàyđiều này

685 hữu ích 2 bình luận chia sẻ 2 bình luận chia sẻ

answer

407

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

import spam
2,
from spam import module
3cho 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 xác định thứ gì đó sẽ được nhập thường xuyên, theo kiểu giống như API. Mô hình này thúc đẩy sự tuân thủ triết lý "phẳng hơn là lồng nhau" của Pythonic.
import spam
2,
from spam import module
3cho 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 xác định thứ gì đó sẽ được nhập thường xuyên, theo kiểu giống như API. Mô hình này thúc đẩy sự tuân thủ triết lý "phẳng hơn là lồng nhau" của Pythonic.

Một ví dụ

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

import spam
4gọi
import spam
5để tương tác với cơ sở dữ liệu của mình. Tôi đã viết một gói "cơ sở dữ liệu" với một vài mô-đun:
import spam
4gọi
import spam
5để tương tác với cơ sở dữ liệu của mình. Tôi đã viết mộ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

Của tôi

from spam import module
3chứa mã sau đây:
from spam import module
3chứa mã sau đây:

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

import spam
5ở đây, tôi có thể bắt đầu một phiên mới bằng cú pháp bên dưới. Mã này sẽ được thực hiện giống nhau từ bên trong hoặc bên ngoài thư mục gói "cơ sở dữ liệu".
import spam
5ở đây, tôi có thể bắt đầu một phiên mới bằng cú pháp bên dưới. Mã này sẽ được thực hiện giống nhau 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ự thuận tiện nhỏ - giải pháp thay thế sẽ là xác định

import spam
5trong 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:
import spam
5trong 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 cách sử dụng thích hợp

from spam import module
3ở đây:
from spam import module
3ở đây:

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

Đa số ý kiến ​​dường như là

from spam import module
3các tệp nên rất mỏng để tránh vi phạm triết lý "rõ ràng là tốt hơn ngầm".
from spam import module
3các tệp nên rất mỏng để tránh vi phạm triết lý "rõ ràng là tốt hơn ngầm".

407 hữu ích 2 bình luận chia sẻ 2 bình luận chia sẻ

answer

138

Có 2 lý do chính cho

from spam import module
3
from spam import module
3

  1. Để thuận tiện: những người dùng khác sẽ không cần biết vị trí chính xác của các chức năng trong phân cấp gói 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 *
    
    # in file1.py
    def add():
        pass

    sau đó những người khác có thể gọi add () bằng

    from your_package import add

    mà không biết file1, như

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

    import spam.module
    1

138 hữu ích 1 bình luận chia sẻ 1 bình luận chia sẻ

answer

94

Các

from spam import module
3tập tin làm cho danh bạ trị Python chứa nó như là mô-đun.
from spam import module
3tập tin làm cho danh bạ trị Python chứa nó như là 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ô-đun được tải hoặc chỉ định các mô hình con được xuất.

94 hữu ích 0 bình luận chia sẻ 0 bình luận chia sẻ

answer

69

Vì Python 3.3,

from spam import module
3không còn cần thiết để xác định các thư mục là các gói Python có thể nhập được.
from spam import module
3không còn cần thiết để xác định các thư mục là các gói Python có thể nhập được.

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

Hỗ trợ riêng cho các thư mục gói không yêu cầu

from spam import module
3tệp đánh dấu và có thể tự động trải rộng trên nhiều phân đoạn đường dẫn (lấy cảm hứng từ các cách tiếp cận khác nhau của bên thứ ba đối với các gói không gian tên, như được mô tả trong PEP 420 )
from spam import module
3tệp đánh dấu và có thể tự động trải rộng trên nhiều phân đoạn đường dẫn (lấy cảm hứng từ các cách tiếp cận khác nhau của bên thứ ba đố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
2

tài liệu tham khảo: 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 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 không cần thiết cho các gói trong Python 3?

69 hữu ích 1 bình luận chia sẻ 1 bình luận chia sẻ

answer

48

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ó

from spam import module
3trong một gói. Tôi sẽ giải thích các
from spam import module
3tập tin với ví dụ dưới đây: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ó
from spam import module
3trong một gói. Tôi sẽ giải thích các
from spam import module
3tập tin với ví dụ dưới đây:

import spam.module
3

from spam import module
3có thể trống rỗ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,
from spam import module
3cũng có thể thiết lập nội dung phù hợp.có thể trống rỗ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,
from spam import module
3cũng có thể thiết lập nội dung phù hợp.

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

import spam.module
4

Sau khi chạy:

import spam.module
5

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

from spam import module
3trong subPackage_b như thế này:Chúng tôi có thể sử dụng
from spam import module
3trong subPackage_b như thế này:

import spam.module
6

Sau khi chạy:

import spam.module
7

Do đó sử dụng * nhập, gói mô-đun là tùy thuộc vào

from spam import module
3nội dung.
from spam import module
3nội dung.

48 hữu ích 0 bình luận chia sẻ 0 bình luận chia sẻ

answer

37

from spam import module
3 sẽ coi thư mục của nó là một mô-đun có thể tải. sẽ coi thư mục của 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 Two-Bit ở đây.bình luận của Nhà giả kim Two-Bit ở đây.

import spam.module
8

37 hữu ích 0 bình luận chia sẻ 0 bình luận chia sẻ

answer

30

from spam import module
3 sẽ coi thư mục của nó là một mô-đun có thể tải.
from spam import module
3tệp, bạn vẫn nên bao gồm một tệp.

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

37 hữu ích 0 bình luận chia sẻ

from spam import module
3tệp:

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

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

import spam.module
9

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

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
4có chứa điều này:

from spam import module
0

Cũng có trường hợp bạn thực sự có thể sử dụng một

from spam import module
3tệp:
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
5bạn cần một trong những điều sau đây:

from spam import module
1

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

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
4bên trong
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
7(thời gian chạy / phụ thuộc chẳng hạn) nhưng bạn chỉ muốn nhập
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

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


import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
4có chứa điều này:
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
4để
from spam import module
3sau đó bạn có thể sử dụng
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
5bằng cách chỉ nhập khẩu
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

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

from spam import module
2

Để sử dụng,

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
5bạn cần một trong những điều sau đây:
from spam import module
3được coi là một phần của gói.


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

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
4bên trong
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
7(thời gian chạy / phụ thuộc chẳng hạn) nhưng bạn chỉ muốn nhập
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
7.Một ví dụ là với JSON , nơi chạy
from database import Session
session = Session()
4thực sự là nhập
from spam import module
3từ
from database import Session
session = Session()
6gói ( xem cấu trúc tệp gói ở đây ):

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

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
4để
from spam import module
3sau đó bạn có thể sử dụng
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
5bằng cách chỉ nhập khẩu
import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
7:
from database import Session
session = Session()
7

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

from spam import module
3được coi là một phần của gói. 0 bình luận chia sẻ