如何找到函数的所有 **args 的列表?
How to find a list of all **args of a function?
如何找到一个函数的所有 **args
的列表?
例如,我知道 symbols()
将 positive=True
、real=True
等作为参数,我想查看这些可能参数的完整列表。
但是,它们未在 Sympy Core doc page.
中列出
而且我已经深入研究了源代码本身,但我无法追踪和定位我要查找的内容。
这些参数被命名为假设,可以在文档中找到:
Sympy Assumptions
假设分类
- 与简化符号相关,例如
Q.positive
, Q.even
.
- 与代数有关 fields/rings,例如
Q.real
, Q.complex
.
- 与一些事实有关,例如.
is_bounded
、is_infinity
、is_zero
和
很快。它们帮助我们以计算为核心进行操作。
显然它们是从上面的其他 classes 派生的
假设(在对象启动时)(在这种情况下,例如
is_zero 表示它是环的零)。或者他们可以
派生自表达式的分析:在这种情况下,我们可以创建一些
class 计算的假设(在这种情况下 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
Using SymPy's New Assumptions
symbols()
函数
正如其他答案所指出的那样 - symbols
中 **args
的一种用途是传递关于正在创建的 Symbol
的假设。您可以通过的假设列表记录在 Assumptions page as supported predicates.
下
但是,你也应该注意一些其他特殊的命名参数可以传入。
这些都记录在您 link 的部分并且是:
cls=<ClassName>
Despite its name, symbols() can create symbol-like objects like instances of Function or Wild classes. To achieve this, set cls keyword argument to the desired type:
N.B。如果未指定,则使用默认的 Symbol
class。
seq=<True|False>
文档说:
If an iterable container is needed for a single symbol, set the seq
argument to True
or terminate the symbol name with a comma
代码漫游
您注意到您已经通读了代码 - 所以我将向您展示这些在代码中的实现位置。如果此时调用symbols()
function, it does various checks of its arguments, including pop
-ing cls
and seq
arguments from **args
it then performs more checks etc, before finally calling through to instantiate the Symbol
here, here or here. These call the constructor of Symbol
(or its subclass passed in via cls
) with whatever is left in **args
which are all interpreted as assumptions
in the constructor. - they are sanitized
here i.e. non-assumption or non-applicable named arguments are thrown out!
这表明假设 + cls
+ seq
形成了可以在 **args
到 symbols()
中传递的命名参数集
其他功能(一般情况)
我突然想到 symbols()
可能只是作为一个更一般问题的代表性示例。我希望上面的内容让您相信所有可以有效传递到 symbols()
的值都已记录在案。这可能会让您相信 SymPy 中的其他函数也是如此。
然而,在一般情况下,答案是很难向自己证明所有可以作为关键字参数传入的值都在 的文档中任何 库或函数。事实上,有时只有一个子集被故意记录下来,因为它们是库的 "public API" 而实际代码可能采用其他参数,但出于某种原因,开发人员不想将它们暴露给 public - 例如因为它们的可用性可能会改变,或者它们的功能未经测试。
如果您 传递无效参数,您使用的库的行为可能会有所不同。一些库或函数会忽略它们,而其他库或函数会在您传入无效关键字参数时抛出错误。
如果您想了解情况是否如此(并且该库是开源的,如 SymPy),那么您可以随时深入了解代码(如我在上面的代码漫游中所示)。如果你这样做 - 你需要遵循执行路径,寻找 args.pop()
的出现。如果您担心 SymPy 中的其他功能,请在评论中告诉我 - 但希望这种通用方法对您有用。
我在上面假设您理解 *args
和 **args
语法。如果这对您来说不是很清楚 - python official tutorial 的这一部分将处理它。
您可以使用名为 inspect
:
的内置 python 库从任何函数获取参数详细信息
import inspect
inspect.getargspec(funcname)
它将return一个ArgSpec
命名的元组,其中包含一些信息,例如:
ArgSpec(args=['myarg'], varargs=None, keywords=None, defaults=(None,))
要获取参数名称,您只需访问 returned 对象的 args
属性即可。
如何找到一个函数的所有 **args
的列表?
例如,我知道 symbols()
将 positive=True
、real=True
等作为参数,我想查看这些可能参数的完整列表。
但是,它们未在 Sympy Core doc page.
而且我已经深入研究了源代码本身,但我无法追踪和定位我要查找的内容。
这些参数被命名为假设,可以在文档中找到: Sympy Assumptions
假设分类
- 与简化符号相关,例如
Q.positive
,Q.even
. - 与代数有关 fields/rings,例如
Q.real
,Q.complex
. - 与一些事实有关,例如.
is_bounded
、is_infinity
、is_zero
和 很快。它们帮助我们以计算为核心进行操作。 显然它们是从上面的其他 classes 派生的 假设(在对象启动时)(在这种情况下,例如 is_zero 表示它是环的零)。或者他们可以 派生自表达式的分析:在这种情况下,我们可以创建一些 class 计算的假设(在这种情况下 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
Using SymPy's New Assumptions
symbols()
函数
正如其他答案所指出的那样 - symbols
中 **args
的一种用途是传递关于正在创建的 Symbol
的假设。您可以通过的假设列表记录在 Assumptions page as supported predicates.
但是,你也应该注意一些其他特殊的命名参数可以传入。
这些都记录在您 link 的部分并且是:
cls=<ClassName>
Despite its name, symbols() can create symbol-like objects like instances of Function or Wild classes. To achieve this, set cls keyword argument to the desired type:
N.B。如果未指定,则使用默认的
Symbol
class。seq=<True|False>
文档说:
If an iterable container is needed for a single symbol, set the
seq
argument toTrue
or terminate the symbol name with a comma
代码漫游
您注意到您已经通读了代码 - 所以我将向您展示这些在代码中的实现位置。如果此时调用symbols()
function, it does various checks of its arguments, including pop
-ing cls
and seq
arguments from **args
it then performs more checks etc, before finally calling through to instantiate the Symbol
here, here or here. These call the constructor of Symbol
(or its subclass passed in via cls
) with whatever is left in **args
which are all interpreted as assumptions
in the constructor. - they are sanitized
here i.e. non-assumption or non-applicable named arguments are thrown out!
这表明假设 + cls
+ seq
形成了可以在 **args
到 symbols()
其他功能(一般情况)
我突然想到 symbols()
可能只是作为一个更一般问题的代表性示例。我希望上面的内容让您相信所有可以有效传递到 symbols()
的值都已记录在案。这可能会让您相信 SymPy 中的其他函数也是如此。
然而,在一般情况下,答案是很难向自己证明所有可以作为关键字参数传入的值都在 的文档中任何 库或函数。事实上,有时只有一个子集被故意记录下来,因为它们是库的 "public API" 而实际代码可能采用其他参数,但出于某种原因,开发人员不想将它们暴露给 public - 例如因为它们的可用性可能会改变,或者它们的功能未经测试。
如果您 传递无效参数,您使用的库的行为可能会有所不同。一些库或函数会忽略它们,而其他库或函数会在您传入无效关键字参数时抛出错误。
如果您想了解情况是否如此(并且该库是开源的,如 SymPy),那么您可以随时深入了解代码(如我在上面的代码漫游中所示)。如果你这样做 - 你需要遵循执行路径,寻找 args.pop()
的出现。如果您担心 SymPy 中的其他功能,请在评论中告诉我 - 但希望这种通用方法对您有用。
我在上面假设您理解 *args
和 **args
语法。如果这对您来说不是很清楚 - python official tutorial 的这一部分将处理它。
您可以使用名为 inspect
:
import inspect
inspect.getargspec(funcname)
它将return一个ArgSpec
命名的元组,其中包含一些信息,例如:
ArgSpec(args=['myarg'], varargs=None, keywords=None, defaults=(None,))
要获取参数名称,您只需访问 returned 对象的 args
属性即可。