Как найти список всех * * ARG функции?
Как найти список всех **args
функций?
Например, я знаю, что symbols()
Взять positive=True
, real=True
, и т.д. в качестве аргументов, и я хотел бы видеть полный список этих возможных аргументов.
Однако они не перечислены на странице Sympy Coredoc .
И я копался в самом исходном коде, но я не могу проследить и найти то, что я ищу.
4 ответа:
symbols()
функцияКак отметили другие ответы - одно использование
**args
вsymbols
состоит в том, чтобы передать предположения о том, чтоSymbol
создается. Список допущений, которые вы можете передать, задокументирован на страницедопущения Какподдерживаемые предикаты .однако, следует также отметить, что некоторые другие специальные именованные аргументы могут быть переданы.
Они оба описаны в разделе, который вы связываете и являются:
cls=<ClassName>
Несмотря на свое название, symbols() может создавать символьные объекты, такие как экземпляры функций или диких классов. Для этого выберите ЦБС ключевое слово аргумент к нужному типу:
N. B. Если не указано, используется класс по умолчанию
Symbol
.
seq=<True|False>
В документах говорится:
Если для одного символа требуется итерационный контейнер, задайте
seq
аргумент кTrue
или завершение символа имя с запятойКодовая прогулка
Вы заметили, что просмотрели код-поэтому я покажу вам, где они реализованы в коде. Если вы позвоните вsymbols()
функция, она делает различные проверки своих аргументов, включаяpop
-ingcls
иseq
аргументы из**args
затем он выполняет дополнительные проверки и т. д., Прежде чем, наконец, вызвать для создания экземпляраSymbol
здесь, здесь или здесь. Эти называют конструкторSymbol
(или его подкласс, переданный черезcls
) с тем, что осталось в**args
, которые все интерпретируются какassumptions
в конструкторе. - они естьsanitized
здесь т. е. неприменимые или неприменимые именованные аргументы выбрасываются в этот момент!Это показывает, что допущения +
cls
+seq
сформируйте набор именованных аргументов, которые можно передать из**args
вsymbols()
Другие функции (общий случай)
Это приходит мне в голову. это
Однако в общем случае ответ заключается в том, что довольно трудно доказать самому себе, что все значения, которые могут быть переданы в качестве ключевых аргументов, находятся в документации любые библиотека или функция. Действительно, иногда только подмножество документируется намеренно, поскольку они являются" публичным API " для библиотеки, тогда как фактический код может принимать другие аргументы, но по какой - то причине разработчик не хочет предоставлять их общественности-например, потому, что их доступность может измениться, или их функциональность непроверена.symbols()
, возможно, просто послужило репрезентативным примером более общего вопроса. Я надеюсь, что вышеизложенное убедило вас в том, что все значения, которые могут быть с пользой переданы вsymbols()
, задокументированы. Это может дать вам некоторую уверенность в том, что то же самое верно и для других функций в рамках SymPy.Если вы передаете недопустимые аргументы, поведение используемой библиотеки может отличаться. Некоторые библиотеки или функции будут игнорировать их, в то время как другие будут выдавать ошибки, если вы передадите недопустимые аргументы ключевого слова.
Если вы хотите выяснить, так ли это (и библиотека с открытым исходным кодом, как SymPy), то вы всегда можете погрузиться в код (как я показываю в описании кода выше). Если вы делаете это - вам нужно следовать по пути исполнения, ища случаи
args.pop()
. Если есть другие функции в SymPy, которые вас беспокоят, дайте мне знать в комментариях - но, надеюсь, это общий метод будет работать для вас.Я предполагаю, что вы понимаете синтаксис
*args
и**args
. Если это не совсем ясно для вас - этот разделpython official tutoria l посвящен ему.
Эти аргументы называются предположениями и могут быть найдены в документации: Симпатические Предположения
Классификация допущений
- связанные с символами для упрощения, напр.
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))
Дополнительные Ссылки:
Wiki Sympi Предположения
Предполагая, что
Установка допущений относительно переменных в Sympy относительно других переменных
Вы можете получить сведения о аргументе из любой функции, используя встроенную библиотеку python под названием
inspect
:import inspect inspect.getargspec(funcname)
Он вернет
ArgSpec
именованный кортеж с некоторой информацией, такой как:ArgSpec(args=['myarg'], varargs=None, keywords=None, defaults=(None,))
Чтобы получить имена аргументов, вы можете просто обратиться к атрибуту
args
возвращаемого объекта.