【问题标题】:Python: importing many variables using a functionPython:使用函数导入许多变量
【发布时间】:2018-12-06 10:40:42
【问题描述】:

背景


  • 我在一个项目中有两个文件。 “main.py”和“auxillary_functions.py”。 'main.py' 包含基本代码,另一个文件包含支持信息。
  • 在主文件中,我迭代了几个案例。对于每种情况,我都必须初始化大量参数,例如

    for i in range(10):
    
       zP1HHSet, zH1HHSet, zISHHSet, zEEHHSet = [], [], [], []
    
       dP1HHSet, dH1HHSet, dISHHSet, dEEHHSet = [], [], [], []
    
       mP1HHSet, mH1HHSet, mISHHSet, mEEHHSet = [], [], [], []
    
       nP1HHSet, nH1HHSet, nISHHSet, nEEHHSet = [], [], [], []
    
       kP1HHSet, kH1HHSet, kISHHSet, kEEHHSet = [], [], [], []
    
       tP1HHSet, tH1HHSet, tISHHSet, tEEHHSet = [], [], [], []
    
       a_IS = 0
       b_IS = 10401
       and so on
    

这是我每次运行都需要初始化的参数的小子集



问题

我想做的是写一个函数,比如说,foo:

def foo(case):

    zP1HHSet, zH1HHSet, zISHHSet, zEEHHSet = [], [], [], []

    dP1HHSet, dH1HHSet, dISHHSet, dEEHHSet = [], [], [], []

    mP1HHSet, mH1HHSet, mISHHSet, mEEHHSet = [], [], [], []

    nP1HHSet, nH1HHSet, nISHHSet, nEEHHSet = [], [], [], []

    kP1HHSet, kH1HHSet, kISHHSet, kEEHHSet = [], [], [], []

    tP1HHSet, tH1HHSet, tISHHSet, tEEHHSet = [], [], [], []

我知道的一个选项是一个一个地返回所有变量,然后将它们解压缩到主文件中。 有没有更好的方法来处理这个问题?



问题

如何导入大量变量?简而言之,我想通过将这组行转移到另一个文件来减少主要代码大小。



【问题讨论】:

  • 为什么要拥有这么多变量?查看 pandas 之类的库,它们似乎更适合您的表格数据。

标签: python import


【解决方案1】:

如果您的参数具有结构(在您的示例中似乎就是这种情况),那么以结构化方式存储它们而不是“扁平”作为一堆变量是一个好主意。这个结构可以很容易地由函数返回或作为参数传递。在 Python 中构建结构有很多不同的选项(列表、字典、namedTuples、数据类、simpleNamespaces ......)。使用SimpleNamespaceNamedTuple 的一种可能的解决方案可能如下所示:

from types import SimpleNamespace
from typing import NamedTuple, List

class ParamSet(NamedTuple):
    P1HHSet: List
    H1HHSet: List
    ISHHSet: List
    EEHHSet: List


def foo(case):
    return SimpleNamespace(
        z=ParamSet([], [], [], []),
        d=ParamSet([], [], [], []),
        m=ParamSet([], [], [], []),
        n=ParamSet([], [], [], []),
        k=ParamSet([], [], [], []),
        t=ParamSet([], [], [], []),
    )


if __name__ == "__main__":
    p = foo(None)

    # access members using attribute syntax
    print(p.z.P1HHSet)
    print(p.k.ISHHSet)

请注意,这只适用于足够新的 Python 版本。使用NamedTupleSimpleNamespace 的优点是可以使用方便的属性语法(例如p.z.P1HHSet)而不是dict(例如p["z"]["P1HHSet"])或索引(例如p[0][0])语法来访问各个参数。

这能回答你的问题吗?

【讨论】:

    【解决方案2】:

    您可以将所有变量放在一个单独的文件中,例如“auxillary_functions.py”。在主文件中,您可以使用 *.文件“auxillary_functions.py”应与“main.py”位于同一目录中。

    在'main.py'中你可以这样做。

    import * from auxillary_functions
    

    【讨论】:

    • namedTuple 怎么样?然后导入这个 namedTuple
    • 亲爱的哈里什,谢谢。我需要为每次迭代初始化这些变量。我已经更新了这个问题来说明同样的问题。谢谢。
    【解决方案3】:

    您可以直接在全局/局部符号表上工作 例如

    globals()[ variable_name ] = variable_value
    locals()[ variable_name ] = variable_value
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多