如何查找函数的所有**参数列表?

时间:2015-08-07 16:00:26

标签: python sympy

如何查找函数的所有**args列表?

例如,我知道symbols()positive=Truereal=True等作为参数,我希望看到这些可能参数的完整列表。 但是,它们未列在Sympy Core doc page中。

我已经挖掘了源代码本身,但我无法追踪并找到我正在寻找的东西。

4 个答案:

答案 0 :(得分:4)

symbols()功能

正如其他答案所指出的那样 - **argssymbols的一个用途是传递有关正在创建的Symbol的假设。您可以传递的假设列表在Assumptions页面下记录为supported predicates

但是 ,您还应该注意,可以传入其他一些特殊的命名参数。

这些都记录在您链接的部分中,并且是:

  1. cls=<ClassName>

      

    尽管名称如此,但symbols()可以创建类似符号的对象,如Function或Wild类的实例。要实现此目的,请将cls关键字参数设置为所需类型:

    N.B。如果未指定,则使用默认的Symbol类。

  2. seq=<True|False>

    文档说:

      

    如果单个符号需要可迭代容器,请设置seq   True的参数或用逗号

    终止符号名称
  3. 代码行走

    您注意到您已查看过代码 - 因此我将向您展示代码中实现这些内容的位置。如果调用symbols()函数,它会对其参数进行各种检查,包括来自**args的{​​{3}}参数,然后执行更多检查等,最后调用以实例化{{1} } pop-ing cls and seqherehere。这些调用Symbol的构造函数(或通过Symbol传递的子类)与cls中剩下的任何内容都被解释为here - 它们是{{3}那么非假设或不适用的命名参数此时为assumptions in the constructor.

    这表明假设+ **args + cls形成了一组可以在seq传递给**args的命名参数

    其他功能(一般情况)

    我认为symbols()可能仅仅是一个更一般性问题的代表性例子。我希望上面已经说服了所有可以有用地传递到symbols()的值。这可能会让您相信SymPy中的其他功能也是如此。

    但是,在一般情况下,答案是很难向自己证明可以作为关键字参数传递的所有值都在 any <的文档中/ strong>库或函数。实际上,有时只有一个子集被故意记录,因为它们是&#34;公共API&#34;对于图书馆而实际的代码可能会采取其他论点,但由于某些原因,开发人员不希望将它们暴露给公众 - 例如因为它们的可用性可能会发生变化,或者它们的功能未经测试。

    如果您执行传递无效参数,则您使用的库的行为可能会有所不同。某些库或函数会忽略它们,而如果传入无效的关键字参数,则其他库会抛出错误。

    如果你想知道是否是这种情况(并且该库是开源的,如SymPy),那么你可以随时浏览代码(正如我在上面的代码行走中所示)。如果你这样做 - 你需要遵循执行的路径,寻找symbols()的出现。如果您关注的SymPy中有其他功能,请在评论中告诉我 - 但希望这种通用方法适合您。

    我在上面假设你理解args.pop()*args语法。如果这对您来说并不完全清楚 - sanitized here l的这一部分会对此进行处理。

答案 1 :(得分:3)

这些参数被命名为假设,可以在文档中找到: Sympy Assumptions

答案 2 :(得分:3)

假设分类

  • 涉及用于简化的符号,例如, Q.positiveQ.even
  • 与代数字段/环相关,例如Q.realQ.complex
  • 与某些事实有关,例如。is_boundedis_infinityis_zero和 等等。它们帮助我们以核心计算进行操作。 显然它们来自上面的其他类 假设(在开始对象的同时)(在这种情况下,例如 is_zero意味着它是一个零的环)。或者他们可以 从表达式的分析中得出:在这种情况下,我们可以创建一些 计算的假设类别(在这种情况下is_zero可以是 意味着但这种计算很难被称为“零” 测试“问题”。在任何情况下,我们都可以记住我们处理的事情 确切地说(现在我们在某个地方我们在第二种意义上使用is_zero)。

假设示例:

M ... Mathematica
S0 ... SymPy, current approach
S1 .... SymPy, approach 1
S2 .... SymPy, approach 2

M: Simplify[1/Sqrt[x] - Sqrt[1/x], x > 0]
S1: x = Symbol('x', assumptions=IsPositive)
  simplify(1/sqrt(x) - sqrt(1/x))
S2: simplify(1/sqrt(x) - sqrt(1/x), Assumptions(x>0))

M: FunctionExpand[Log[x y], x > 0 && y > 0]
S1: x, y = Symbol('x', assumptions=IsPositive), Symbol('y', assumptions=IsPositive)
 log(x*y).expand()
S2: log(x*y).expand(Assumptions([x>0, y>0]))

M: Simplify[Sin[n Pi], n \[Element] Integers]
S1: n = Symbol('n', assumptions=IsInteger)
  simplify(sin(n*pi))
S2: simplify(sin(n*pi), Assumptions(Element(n, Integer)))

# we can talk about the syntax of Element(n, Integer)

M: FunctionExpand[EulerPhi[m n], {m, n} \[Element] Integers && GCD[m, n] == 1]
S1: n = Symbol('n', assumptions=IsInteger)
  m = Symbol('m', assumptions=IsInteger)
  n.assumptions.add(Eq(gcd(m, n) - 1))
  euler_phi(m, n)
S2: euler_phi(m, n).expand(Assumptions([Element(n, Integer), Element(m, Integer), Eq(gcd(m, n) - 1)]))

# again we can talk about the syntax of Element(n, Integer)

M: RealQ[x, x \[Element] Real]
S0: x = Symbol('x',real=True, integer=True)
  assert x.is_real == True
S1:
S2: assert IsElement(x, Real, assumptions=Element(x, Real))

M: Refine[Abs[x], x>0]
   Refine[Abs[x], x0))
  print e.refine(Assumptions(x))

更多参考资料:

Wiki Sympi Assumptions

Assuming

Setting Assumptions on Variables in Sympy Relative to Other Variables

Using SymPy's New Assumptions

答案 3 :(得分:1)

您可以使用名为inspect的内置python库从任何函数获取参数详细信息:

import inspect
inspect.getargspec(funcname)

它将返回一个ArgSpec命名元组,其中包含以下信息:

ArgSpec(args=['myarg'], varargs=None, keywords=None, defaults=(None,))

要获取参数名称,只需访问该返回对象的args属性即可。