Saya ingin mendefinisikan konstanta yang harus tersedia di semua submodul dari sebuah paket. Saya sudah berpikir bahwa tempat terbaik adalah di dalam __init__.py
file paket root. Tetapi saya tidak tahu bagaimana melakukan ini. Misalkan saya memiliki beberapa sub paket dan masing-masing dengan beberapa modul. Bagaimana saya bisa mengakses variabel itu dari modul-modul ini?
Tentu saja, jika ini benar-benar salah, dan ada alternatif yang lebih baik, saya ingin mengetahuinya.
from . import MY_CONSTANT
from mypackage.constants import *
akan menempatkan salinanMY_CONSTANT
dalam setiap submodule daripada referensi ke variabel yang samaMY_CONSTANT
di salah satu modul, itu akan bermutasi di mana-mana. Jika Anda ditugaskan ulangMY_CONSTANT
di salah satu modul, itu hanya akan mempengaruhi modul itu. Jika itu niat Anda, Anda harus referensi berdasarkan atribut, yaitumypackage.constants.MY_CONSTANT
.mymodule.py
dalam__init__.py
sebelumMY_CONSTANT = 42
itu akan gagal karena ketika mengimpormymodule.py
MY_CONSTANT
belum ditetapkan belum. Jadi perlu pindah keMY_CONSTANT = 42
atasimport mymodule
Kamu tidak bisa melakukan itu. Anda harus mengimpor konstanta Anda secara eksplisit ke namespace setiap modul. Cara terbaik untuk mencapai ini adalah dengan mendefinisikan konstanta Anda dalam modul "konfigurasi" dan mengimpornya di mana pun Anda membutuhkannya:
sumber
sys.modules
.Anda dapat mendefinisikan variabel global dari mana saja, tetapi itu adalah ide yang sangat buruk. impor
__builtin__
modul dan modifikasi atau tambahkan atribut ke modul ini, dan tiba-tiba Anda memiliki konstanta atau fungsi bawaan yang baru. Bahkan, ketika aplikasi saya menginstal gettext, saya mendapatkan fungsi _ () di semua modul saya, tanpa mengimpor apa pun. Jadi ini mungkin, tetapi tentu saja hanya untuk proyek tipe Aplikasi, bukan untuk paket atau modul yang dapat digunakan kembali.Dan saya kira tidak ada yang akan merekomendasikan praktik ini. Apa yang salah dengan namespace? Aplikasi tersebut memiliki modul versi, sehingga saya memiliki variabel "global" yang tersedia seperti
version.VERSION
,version.PACKAGE_NAME
dll.sumber
Hanya ingin menambahkan bahwa konstanta dapat digunakan menggunakan file config.ini dan diuraikan dalam skrip menggunakan perpustakaan configparser. Dengan cara ini Anda bisa memiliki konstanta untuk berbagai keadaan. Misalnya, jika Anda memiliki konstanta parameter untuk dua permintaan URL terpisah, beri label seperti:
Saya menemukan dokumentasi di situs web Python sangat membantu. Saya tidak yakin apakah ada perbedaan antara Python 2 dan 3 jadi di sini adalah tautan ke keduanya:
Untuk Python 3: https://docs.python.org/3/library/configparser.html#module-configparser
Untuk Python 2: https://docs.python.org/2/library/configparser.html#module-configparser
sumber