Как определить константу python из строкового ключа

#python #configuration #constants

#python #конфигурация #константы

Вопрос:

У меня есть модуль, в котором определены константы __init__.py . Я хотел бы прочитать в файле конфигурации и определить константы на основе этого содержимого конфигурации. Есть ли способ определить константы из строковых ключей, например:

__init__py :

 config = { "FOO": "BAR" }
for key, value in config.items():
    define(key, value) # <- "define" is what I am looking for
  

foo.py :

 from . import FOO
print(FOO)
> BAR
  

Я также рассматривал объект класса Config, который имеет эти константы, но тогда мне всегда приходилось бы обращаться к ним через объект; не так аккуратно, как просто писать константу в моем коде.

Или есть какой-либо другой более питонический способ сделать это?

Ответ №1:

Для достижения этой цели вы должны создать переменную в своем модуле, но, поскольку вы знаете имя переменной только во время выполнения, вам придется использовать setattr ее в своем модуле (к которому вы можете получить доступ из sys модуля):

 import sys

setattr(sys.modules[__name__], var_name, var_val)
  

Комментарии:

1. Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.

2. Оба ответа работают. В итоге я использовал этот, поскольку немного более очевидно, что делает код, например. установите атрибут в модуле , чтобы его можно было импортировать.

Ответ №2:

Вы могли бы добавить их в builtins:

 import builtins

config = { "FOO": "BAR" }
for key, value in config.items():
    # I prefer to have them prefixed, to make sure not overwriting existing values!
    setattr(builtins, 'cfg_%s' % key, value)

# available everywhere (other modules as well)
print(cfg_FOO)
  

Out:

 BAR
  

Комментарии:

1. Спасибо, что указали builtins , до сих пор даже не знал о них.