【问题标题】:Python: Pythonic way to import all variables with a specific identifier?Python:使用特定标识符导入所有变量的 Pythonic 方式?
【发布时间】:2022-01-02 17:12:22
【问题描述】:

我想整齐地导入文件中名称中包含“_COLUMN”的所有变量。我这样做是因为有 20 多个变量,并且 normal 导入语句会很大。我还希望变量可以直接访问,例如TIME_COLUMN 而不是 earthquakes.tools.TIME_COLUMN

以下代码有效:

import earthquakes.tools    
for item in dir(earthquakes.tools):
    if '_COLUMN' in item:
        exec(f'from earthquakes.tools import {item}')

这被认为是 Pythonic 吗?如果没有,是否有更好的方法或者甚至不应该这样做?

有关信息,我尝试在导入语句和其他解决方案中搜索正则表达式,但没有发现任何重要的信息。

请不要提及from ... import *,因为它不是Pythonic

【问题讨论】:

  • import earthquakes.tools 不是已经全部导入了吗?
  • 必读 nedbatchelder.com/blog/201112/…stupidpythonideas.blogspot.com/2013/05/… 很可能最好使用字典而不是单个名称。
  • foo_COLUMN = earthquake.tools.foo_COLUMN 对应每个相关的foo。使用dir 进行查询没有多大意义,因为如果您不知道哪些列已经存在,那么您将不知道循环使哪些变量可用。
  • @ScottHunter 确实如此,但我希望它们可以直接访问。我编辑了问题以反映这一点。
  • @chepner 即使有 20 多个变量并且数量可能会增长?

标签: python python-3.x import


【解决方案1】:

所有_COLUMN-prefixed 变量可能首先应该是dict,但如果你不能自己在earthquake.tools 中这样做,你可以使用getattr 构建一个本地变量。

import earthquake.tools


column_names = ["foo", "bar", "baz", ...]

columns = {k: getattr(earthquake.tools, f'{k}_COLUMN') for k in column_names}

不要使用dir 来“推断”列名。没有人会在不知道earthquake.tools 首先定义什么的情况下知道定义了哪些变量,所以要明确并列出您期望要使用的名称。 (创建一个你永远不会实际使用的变量是没有意义的。)

【讨论】:

    【解决方案2】:

    你可以使用这个技巧

    from earthquakes.tools import *
    

    【讨论】:

    • 我相信这不是非常Pythonic
    • 是的,但是由于调用模块的所有变量并不是那么有趣,所以很难给出一个非常有趣的解决方案......对吗?
    【解决方案3】:

    您可以覆盖模块的__all__ 变量:

    tools.py

    __all__ == ['var1_COLUMN', 'var2_COLUMN', 'var3_COLUMN']
    

    main.py:

    from earthquakes.tools import *
    

    了解更多:Importing * From a Package

    【讨论】:

    • 我觉得这有点hacky而且不是很Pythonic?这不是也意味着每次添加或删除变量时都要编辑__all__ 吗?
    • 您可以在模块中动态构建变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2022-11-01
    • 2012-09-10
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多