Pertanyaan Apa yang `__import __ ('pkg_resources'). Declare_namespace (__ name __)` lakukan?


Di beberapa __init__.py file modul Saya melihat satu baris:

__import__('pkg_resources').declare_namespace(__name__)

Apa yang dilakukan dan mengapa orang menggunakannya? Misalkan itu terkait dengan mengimpor dinamis dan menciptakan namespace saat runtime.


37
2017-10-16 17:15


asal


Jawaban:


Itu bermuara pada dua hal:

  1. __import__ adalah fungsi Python yang akan mengimpor paket menggunakan string sebagai nama paket. Ini mengembalikan objek baru yang mewakili paket yang diimpor. Begitu foo = __import__('bar') akan mengimpor paket bernama bar dan menyimpan referensi ke objeknya dalam variabel objek lokal foo.

  2. Dari util setup pkg_resources ' dokumentasi, declare_namespace() "Deklarasikan [s] nama paket bertitik adalah" paket namespace "yang berisi paket dan modul dapat tersebar di beberapa distribusi."

Begitu __import__('pkg_resources').declare_namespace(__name__) akan mengimpor paket 'pkg_resources' menjadi sementara dan memanggil declare_namespace fungsi yang tersimpan di sementara itu (yang __import__ fungsi mungkin digunakan daripada import pernyataan sehingga tidak ada simbol tambahan yang tersisa bernama pkg_resources). Jika kode ini masuk my_namespace/__init__.py, kemudian __name__ aku s my_namespace dan modul ini akan dimasukkan dalam my_namespace paket namespace.

Lihat alat pengaturan dokumentasi untuk lebih jelasnya

Lihat pertanyaan ini untuk diskusi tentang mekanisme yang lebih tua untuk mencapai efek yang sama.

Lihat PEP 420 untuk mekanisme standar yang menyediakan fungsi serupa yang dimulai dengan Python 3.3.


34
2017-10-16 20:49



Ini adalah cara untuk mendeklarasikan apa yang disebut "paket namespace" dengan Python.

Apa ini dan apa masalahnya:

Bayangkan Anda mendistribusikan produk perangkat lunak yang memiliki banyak fungsi, dan tidak semua orang menginginkan semuanya, sehingga Anda membaginya menjadi beberapa bagian dan dikirimkan sebagai plugin opsional.

Anda ingin orang-orang dapat melakukannya

import your_project.plugins.plugin1
import your_project.plugins.plugin2
...

Yang baik-baik saja jika struktur direktori Anda persis seperti di atas, yaitu

your_project/
    __init__.py
    plugins/
        __init__.py
        plugin1.py
        plugin2.py

Tetapi bagaimana jika Anda mengirimkan dua plugin tersebut sebagai paket python terpisah sehingga mereka berada di dua direktori yang berbeda? Kemudian Anda mungkin ingin menempatkan __import__('pkg_resources').declare_namespace(__name__) di masing-masing paket __init__.py sehingga Python mengetahui paket-paket itu adalah bagian dari "paket namespace" yang lebih besar, dalam kasus kami itu your_project.plugins.

Silakan merujuk ke dokumentasi untuk info lebih lanjut.


6
2018-05-08 21:08