для того, чтобы свести к минимуму жёстко прописанные значения на протяжении всей моей программы, я определил набор констант, как показано в следующем Constants.py
:перекрывая набор пространствами имен констант
FOO = 42
HOSTNAME=socket.gethostname()
BAR = 777
все модули, которые хотят использовать эти константы, просто сделать import Constants
и сразу же использовать Constants.FOO
.
Теперь некоторые из этих констант могут зависеть от фактического хоста, на котором запущена программа. . поэтому я хотел бы переопределить некоторые из них выборочно, основываясь на реальной среде приложение работает в первая грубая попытка выглядела следующим Constants.py
:
FOO = 42
HOSTNAME=socket.gethostname()
if HOSTNAME == 'pudel':
BAR = 999
elif HOSTNAME == 'knork'
BAR = 888
else:
BAR = 777
в то время как это работает нормально, это загромождает файл со специальными случаями, которых я бы хотел избежать.
, если я был в этом оболочка-сценариев я хотел бы использовать что-то вроде этого Constants.sh
:
FOO = 42
HOSTNAME=$(hostname)
BAR = 777
# load host-specific constants
if [ -e Constants_${HOSTNAME}.sh ]; then
. Constants_${HOSTNAME}.sh
fi
и дополнительный Constants_pudel.sh
, который выглядит как:
BAR = 999
, который сохраняет общие константы вместе и позволяет чтобы легко переопределить их в отдельных файлах.
так как я не пишу скрипт-скрипт, а программу-питон, мне было интересно, как добиться того же результата.
без толку я пытался что-то вроде:
FOO = 42
HOSTNAME=socket.gethostname()
BAR = 777
try:
__import__('Constants_'+HOSTNAME)
except ImportError:
pass
и Constants_poodle.py
будет выглядеть так:
import Constants
Constants.BAR = 999
это работает нормально, в Constants_poodle
, но когда я пытаюсь import Constants
в другом файле питона, Я получаю оригинал Constants.BAR
.
не работает вообще, используя __import__()
кажется исключительно уродливым, поэтому я думаю, что есть правильный способ переопределить экспортированные константы для конкретных настроек?
* Эти константы могут зависеть от фактического хоста, на котором работает программа *. Тогда они не являются константами ... – gerrit
ну, я считаю их постоянными в данном контексте. но не стесняйтесь редактировать квесто с лучшей формулировкой для тех * констант * –