numpy,scipy,在函数,模块之间传递大量变量,很容易

时间:2015-02-20 18:08:49

标签: python matlab numpy matplotlib

所以我正在使用numpy,scipy,matplotlib进行科学计算,运行一些模拟并尝试对它们进行模块化操作,而且我遇到了问题。试图从matlab调整我的工作流程。

在matlab中,我通常会写出几个分散在不同文件上的函数 - 一个用参数作为参数运行模拟,一个运行对这些模拟的结果进行评估,从中提供不同的参数值,一个单独的函数绘制根据参数等的结果和标题,通常参数集和结果集将是不同类型变量的非常大的组合,因此我将它们打包成结构。在matlab中有一个名为v2struct的函数,可以很容易地在我运行的不同操作之间打包和解包这些变量组合。另外,我似乎没有遇到matlab中名称空间的问题。

现在在python中,我希望能够做同样的事情。我正在慢慢学习如何编写类,但我找不到关于如何在我的文件系统中组织这些文档的非常好的文档。因为我更喜欢编写函数和脚本(我认为这是正确的术语)并使用ipython%run script.py`运行它们我想利用相同类型的能力传递大量参数和结果变量各种功能来运行模拟,测试结果和绘制结果。这就是为什么我一直在尝试将东西打包成字典,然后将它们解压缩到其他命名空间中。这将使我更容易分解我已经完成的代码脚本,将这些模拟导入模块化部分。

但每当我试图弄清楚如何做到这一点时,我会看到很多“没有人应该动态创建变量”和“我无法想象为什么你会想要解压缩字典。”那些字典绕过函数的意义是什么?我期待很多不同的函数可以使用相同的变量集。是的,我知道这意味着课程。但它们真的很难设计,至少对于科学计算而言。或者只是为了我。有中间地位吗?

有没有人有任何链接到任何教你如何解决这个问题的教程?资源,教你如何设计代码(也就是我理解如何使用python从900亿“intro to python”教程中编写脚本,但是在找出如何将我的脚本转换为模块(即重构)方面存在差距。我知道如何编写一个类,但不知道如何选择如何将我的脚本放入类中,或者何时将内容划分为子类,或者特别是如何使用我用我的一个脚本创建的类。


好的,这是我登陆的解决方案: 将我的脚本(全部共享一个命名空间)分解为函数(对同一变量起作用,但在不同的命名空间中)我创建了一个密钥列表('tuple','of','keys'),用于将变量从函数名称空间打包到输出中字典:

returnVals = dict();
for k in keylist:
    returnVals[k]=locals()[k]

return returnVals

为了让事情变得更容易(我希望),我会自动将参数名称打包到密钥列表中:

argNames = my_function.func_code.co_varnames[:my_function.func_code.co_argcount]

然后keynames = argNames + ('stuff','function','computes')

唯一令人烦恼的是必须重写函数参数中的所有变量名(即def subfunction(sameVarName1,sameVarName2,etc):) 所以当我调用subfunction(**whateverINamedMyReturnValsInLastFunction)时,函数会知道kwargs中的键是什么。但是,我认为,从长远来看,这将帮助我(希望)能够重用我的代码。

1 个答案:

答案 0 :(得分:4)

我普遍同意"没有人应该动态创建变量" 但强烈反对"我[原文如此]无法想象你为什么要打开包装 字典。" [1]

Unpacking a dictionary是解决当前问题的一种非常好的方法:

def foo():
    result = dict()
    # fill `result` with values
    result[key] = value
    ...
    return result

def bar(arg1, arg2, ...):
    ...

result = foo()
bar(**result)

最后一行解包result中的键/值对,并将它们作为参数传递给bar

bar(**{key1:value1, key2:value2})

相当于

bar(key1=value1, key2=value2)

我不认为you really need to define a class只是传递价值观。字典会做。


[1] 嗯,第二个想法,它取决于"打开字典"的含义。将字典解压缩到全局命名空间是个坏主意,但是将字典解压缩到一个函数是可以的。