【问题标题】:Python : how to print values of all constants from an import?Python:如何从导入中打印所有常量的值?
【发布时间】:2025-12-04 16:05:01
【问题描述】:

我将我的常量(可以是字典)分组并存储在一个单独的 python 文件中。例如。参数.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.

【问题讨论】:

  • varspprint,例如:pprint(vars(parameters))

标签: python variables import names


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 更新为包含 Python3 选项
    【解决方案3】:

    试试这个:

    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 很慢,evalexec 通常应该避免,因为它们可能会带来安全风险。有关详细信息,请参阅 SO 老将 Ned Batchelder 的Eval really is dangerous
    【解决方案4】:

    假设这是一个“普通”模块,你可以使用__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 编辑

    【讨论】: