Как найти список всех * * 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возвращаемого объекта.