Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
遍历导入常量的Pythonic方法_Python - Fatal编程技术网

遍历导入常量的Pythonic方法

遍历导入常量的Pythonic方法,python,Python,我正在从文件constants.py中导入一些常量,如下所示: from constants import (SOME_CONST, OTHER_CONST, ANOTHER_ONE) 这些常量是文件名,我从中读取数据,我想要实现的是: for filename in [SOME_CONST, OTHER_CONST, ANOTHER_ONE]: # process file 常数.py SOME_CONST = "filename.txt" OTHER_CONST = "myfil

我正在从文件
constants.py
中导入一些常量,如下所示:

from constants import (SOME_CONST, OTHER_CONST, ANOTHER_ONE)
这些常量是文件名,我从中读取数据,我想要实现的是:

for filename in [SOME_CONST, OTHER_CONST, ANOTHER_ONE]:
    # process file
常数.py

SOME_CONST = "filename.txt"
OTHER_CONST = "myfile.xml"
ANOTHER_ONE = "file.csv"

但我想知道是否有办法避免在for中声明列表,比如遍历或构建导入常量的列表,因为可以有很多常量,而不是像示例中那样只有3个,而且很容易出错,因为我需要导入常量并将其添加到列表中,我只想导入它并处理导入的任何内容。

如果您遵守python约定,即使用大写字母命名全局变量(并且只使用它们),那么您可以按照Davidmm的建议:

for filename in [i for i in dir(constants) where i.upper() == i]:
    ...

不能列出“所有导入的常量”。它们只是当前模块中的多个全局常量

你的选择是:

  • 列出
    常量
    模块上的所有名称:

    import constants
    
    for name in dir(constants):
        const = getattr(constants, name)
    
    如果这些名称遵循以下模式,则可以对其进行筛选:

    for name in dir(constants):
        if name.startswith('FOO_'):
    
    过滤器可以是一个简单的过程,例如检查名称是否全部为大写

  • 将列表声明为常量模块的一部分,并将其导入

  • 在当前模块中声明名称列表,并使用该列表“导入”常量:

    import constants
    
    const_names = ['SOME_CONST', 'OTHER_CONST', 'ANOTHER_ONE']
    for const_name in const_names:
        const = getattr(constants, const_name)
    

  • 没有“导入常量”这样的东西;他们都是全球性的。您是从
    常量导入所有名称,还是它们有特定的模式?
    导入常量;目录(常量)
    可能会对您有所帮助。它将列出该模块中的所有内容。@MartijnPieters没有模式,我更新了我的问题。@Davidmh这很有用,遗憾的是,该文件包含许多此模块中未使用的其他常量。您可以指定一个筛选器,因此,您只需设置一次。选项3可能是在尊重DRY的同时选择常量子集的最简单方法。在我的常量名称中添加前缀
    PRE
    ,并对其进行筛选似乎是正确的选项。@如果您的所有常量都是大写,而模块中的其他任何常量都不是大写,如果name.upper()==name:
    ,则可以按
    进行筛选。这样你就不需要添加前缀了。