【发布时间】:2016-06-23 17:40:32
【问题描述】:
我正在编写一个程序来为我的微观经济学课做一些计算。由于根据给定的问题有一些工作方式,我创建了一个类。该类从命令行解析实用程序函数和“模式”,并根据模式调用一个或另一个函数。
由于每个函数都使用相同的变量,我在__init__() 中启动它们:
self.x = x = Symbol('x') # Variables are initiated
self.y = y = Symbol('y')
self.Px, self.Py, self.m = Px, Py, m = Symbol('Px'), Symbol('Py'), Symbol('m')
我需要一个本地定义来成功处理该函数。通过sympify() 启动函数后,我将其保存为实例变量:
self.function = sympify(args.U)
现在我需要将变量x,yPx,Py,m 传递给不同的函数。这就是我遇到问题的地方。因为我想要一个本地定义,所以我可以简单地 x=self.x 使用所有变量。我需要在每段不可持续的代码中重复这一点。另一种选择是将所有变量作为参数传递。
但是由于我使用字典来根据模式选择要调用的函数,这意味着我必须为每个函数传递相同的参数,无论我是否使用它们。
所以我决定创建一个字典,例如:
variables = { #A dictionary of variables is initiated
'x':self.x,
'y':self.y,
'Px':self.Px,
'Py':self.Py,
'm':self.m
}
在我将变量声明为 sympy Symbols 后启动此字典。我想要的是把这本字典以解包的形式传递给每个函数。这样我只需要**kwargs 作为参数,我可以使用我想要的变量。
我想要的是这样的:
a = 3
arggs = {'a' = a}
def f(**kwargs):return a+1
f(**args)
这将返回 4。但是,当我将字典作为参数传递时,我得到一个未定义的“x”或“y”变量错误。这不可能是范围问题,因为所有实例的所有变量都已启动。
这是我调用该函数的代码:
self.approaches[self.identification][0](**self.variables)
def default(self, **kwargs):
solutions = dict()
self.MRS = S(self.function.diff(x) / self.function.diff(y)) # This line provokes the exception
我的错误是什么?
PS:有些信息可能不清楚。英语不是我的主要语言。提前道歉。
【问题讨论】:
标签: python function dictionary arguments sympy