Каков наилучший способ инициализации и использования консистентов в классах Python?
Вот как я объявляю константы и использую их в разных классах Python:
# project/constants.py
GOOD = 1
BAD = 2
AWFUL = 3
# project/question.py
from constants import AWFUL, BAD, GOOD
class Question:
def __init__(self):
...
Является ли это хорошим способом хранения и использования значений констант? Я понимаю, что через некоторое время файл констант может стать довольно большим, и я могу явно импортировать 10+ из этих констант в любой файл.
Ответы
Ответ 1
почему бы просто не использовать
import constants
def use_my_constants():
print constants.GOOD, constants.BAD, constants.AWFUL
Из python zen:
Пространства имен хороши. Давайте сделаем еще больше!
РЕДАКТИРОВАТЬ: Кроме того, когда вы цитируете, вы должны включить ссылку и проверить ее, потому что, как указывали другие, она должна читать:
Пространства имен - одна хорошая идея - позвольте сделать больше из них!
На этот раз я на самом деле скопировал его из источника: PEP 20 - Zen of Python
Ответ 2
У вас также есть опция, если константы привязаны к определенному классу и используются конфиденциально в этом классе, чтобы сделать их специфичными для этого класса:
class Foo(object):
GOOD = 0
BAD = 1
WTF = -1
def __init__(self...
и уходите.
Ответ 3
Попробуйте просмотреть следующие ссылки (одна ссылка содержит квитанцию от активного состояния о том, как реализовать реальные константы):
Импорт длинного списка констант в файл Python
Создать константы, используя "настройки" модуль?
Могу ли я предотвратить изменение объекта в Python?
Ответ 4
У вас есть несколько вариантов:
- Сделайте это так, как вы делаете прямо сейчас с файлом констант
- Используйте плоский файл и проанализируйте его один раз, передайте словарь/класс вокруг
- Запрос в базу данных
С верхней точки зрения 1 и 2 примерно одинаковы. Что касается вашего вопроса об импорте конкретных констант, гораздо проще использовать одну из следующих конвенций:
-
import constants; some_func(constants.AWFUL)
-
from constants import *; some_func(AWFUL)