Я группирую и сохраняю мои константы (может быть dict.) В отдельном файле python. Например, parameters.py:
HARD_COPY=True
BOOKS={
2018:{"author":"Hugo"}
}
etc.
В исходном файле я пишу:
import parameters as para
Конечно, я могу использовать переменные, зная их имена (para.BOOKS и т.д.). Но я хочу показать их имена и ценности, какими бы ни были эти имена.
Если я пишу dir (para), я могу увидеть список этих имен. Но как я могу напечатать свои ценности?
Я бы хотел отобразить:
My defined variables in parameters.py :
HARD_COPY : True
BOOKS : {2018:{"author":"Hugo"}}
etc.
Используйте getattr
для доступа к его значению по имени.
import parameters as para
print('My defined variables in parameters.py : ')
for variable in dir(para):
if not variable.startswith('__'):
print(variable, ':', getattr(para, variable))
Выход:
My defined variables in parameters.py :
BOOKS : {2018: {'author': 'Hugo'}}
HARD_COPY : True
Если вы хотите сохранить константы (или переменные конфигурации), вы должны рассмотреть их сохранение в формате json
.
Скажем, у вас есть файл конфигурации config.json
который имеет следующие значения
{
"HARD_COPY": true,
"BOOKS": {
"2018": {
"author": "Hugo"
}
}
}
Вы можете загрузить эти значения из .py
файла, используя следующие
import json
with open('config.json') as f:
data = json.load(f)
Чтобы затем перебрать эти значения, вы можете сделать следующее
Python 2.7
for key, val in my_books.iteritems():
print(key, val)
>>>('HARD_COPY', True)
>>>('BOOKS', {2018: {'author': 'Hugo'}})
Python 3
for key, val in my_books.items():
print(key, val)
>>> HARD_COPY True
>>> BOOKS {2018: {'author': 'Hugo'}}
Предполагая, что это "нормальный" модуль, вы можете использовать __dict__
:
import parameters as para
for k, v in para.__dict__.items():
if k.isupper():
print("name:", k, "value:", v)
Я использовал isupper()
поскольку это соглашение для констант (хотя они и не совсем).
дает:
name: HARD_COPY value: True
name: BOOKS value: {2018: {'author': 'Hugo'}}
EDIT благодаря @Aran-Fey
vars
Попробуй это:
import parameters as para
for name in dir(para):
if not name.startswith('__'):
myvalue = eval('para.%s'%name)
print(name,"is",myvalue)
Выход:
BOOKS is {2018: {'author': 'Hugo'}}
HARD_COPY is True
eval
здесь. eval
медленен, eval
и exec
как правило, следует избегать, поскольку они могут представлять угрозу безопасности. За подробностями обращайтесь к Eval, действительно опасному для SO ветеранов Ned Batchelder.