Python: как напечатать значения всех констант из импорта?

1

Я группирую и сохраняю мои константы (может быть 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.
Теги:
variables
import
names

4 ответа

1
Лучший ответ

Используйте 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
1

Если вы хотите сохранить константы (или переменные конфигурации), вы должны рассмотреть их сохранение в формате 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'}}
  • 1
    код Python 2 в 2018 году: /
  • 0
    Обновлен для включения опции Python3
0

Предполагая, что это "нормальный" модуль, вы можете использовать __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

  • 2
    Так vars
0

Попробуй это:

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
  • 1
    Нет необходимости использовать eval здесь. eval медленен, eval и exec как правило, следует избегать, поскольку они могут представлять угрозу безопасности. За подробностями обращайтесь к Eval, действительно опасному для SO ветеранов Ned Batchelder.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню