我应该将症状符号传递给函数吗?

时间:2017-04-26 12:30:30

标签: python global-variables sympy

没有将症状符号传递给函数的缺点吗?

def compute(alpha,a): #or def compute(a)
    return 3*alpha+a

alpha = sympy.symbols("alpha")
expr = compute(alpha,3)

我没有必要将alpha传递给compute()(我假设因为它是一个全局变量),而且现在,我认为它可以让代码在我离开时更具可读性。 这被认为是糟糕的设计吗?我想这是一个普遍的“如何处理python中的全局变量”问题,正如已经被问到here,但答案说它将取决于具体的用例。

在调用该函数之前,我仍然需要创建alpha符号,如果我不包含它,那就不明显了。

2 个答案:

答案 0 :(得分:2)

与列表(另一个问题是关于)相比,SymPy treats symbols (and expressions) as immutable。此外,它们由您传递给Symbolsymbols的字符串唯一标识。为便于说明,请考虑以下事项:

from sympy import Symbol
print({Symbol("a"), Symbol("a")})
>>> {a}

因此,将SymPy符号声明为全局变量不会构成如此大的问题 - 就像全局定义一些数学常量一样。例如,使用此符号的某些合理代码不会改变它.¹

因此,根据具体情况,它可能有意义:

  1. 全局定义alpha
  2. alpha作为参数传递给函数
  3. 在每次调用时定义函数内的alpha(这是可能的,因为符号仅取决于相关的字符串)。
  4. 如果没有进一步的背景,就不可能说出哪种情况适用于你的情况。

    ¹请注意,不合理的代码仍然可以这样做,例如:

    from sympy.abc import a
    from sympy.abc import a as a_2
    a.name = "b"
    print(a_2)
    >>> b   
    

答案 1 :(得分:1)

在文件顶部定义常用的符号(即全局)是非常好的做法。正如其他人所指出的那样,即使它再次被定义,它也不会真正重要,因为具有相同名称的两个符号被认为是相等的。 这里有一个重要的警告:如果你使用假设,比如real=True,那么这很重要。因此,您应该避免使用两个具有相同名称但不同假设的符号。

在您的示例中,如果alpha始终应该是符号Symbol('alpha'),那么为永远不会更改的函数设置参数是没有意义的。

顺便说一下,你可以做的另一种方法是根本没有这个功能,只是使用带有符号变量的表达式

alpha, a = symbols('alpha a')
expr = 3*alpha + a

然后在想要替换值时使用subs

expr.subs({a: 3}) # or expr.subs(a, 3)