如何查找函数的所有**args
列表?
例如,我知道symbols()
将positive=True
,real=True
等作为参数,我希望看到这些可能参数的完整列表。
但是,它们未列在Sympy Core doc page中。
我已经挖掘了源代码本身,但我无法追踪并找到我正在寻找的东西。
答案 0 :(得分:4)
symbols()
功能正如其他答案所指出的那样 - **args
中symbols
的一个用途是传递有关正在创建的Symbol
的假设。您可以传递的假设列表在Assumptions页面下记录为supported predicates。
但是 ,您还应该注意,可以传入其他一些特殊的命名参数。
这些都记录在您链接的部分中,并且是:
cls=<ClassName>
尽管名称如此,但symbols()可以创建类似符号的对象,如Function或Wild类的实例。要实现此目的,请将cls关键字参数设置为所需类型:
N.B。如果未指定,则使用默认的Symbol
类。
seq=<True|False>
文档说:
如果单个符号需要可迭代容器,请设置
终止符号名称seq
True
的参数或用逗号
您注意到您已查看过代码 - 因此我将向您展示代码中实现这些内容的位置。如果调用symbols()
函数,它会对其参数进行各种检查,包括来自**args
的{{3}}参数,然后执行更多检查等,最后调用以实例化{{1} } pop
-ing cls
and seq
,here或here。这些调用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.positive
,Q.even
。Q.real
,Q.complex
。is_bounded
,is_infinity
,is_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))
更多参考资料:
Setting Assumptions on Variables in Sympy Relative to Other Variables
答案 3 :(得分:1)
您可以使用名为inspect
的内置python库从任何函数获取参数详细信息:
import inspect
inspect.getargspec(funcname)
它将返回一个ArgSpec
命名元组,其中包含以下信息:
ArgSpec(args=['myarg'], varargs=None, keywords=None, defaults=(None,))
要获取参数名称,只需访问该返回对象的args
属性即可。