Python:如何从导入中打印所有常量的值?

Python : how to print values of all constants from an import?

我将常量(可以是字典)分组并存储在单独的 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.

如果您正在考虑存储常量(或配置变量),您应该考虑以 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'}}

试试这个:

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

假设这是一个 "normal" 模块,您可以使用 __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'}}

编辑感谢@Aran-Fey

使用 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