Как найти список всех * * ARG функции?


Как найти список всех **args функций?

Например, я знаю, что symbols() Взять positive=True, real=True, и т.д. в качестве аргументов, и я хотел бы видеть полный список этих возможных аргументов. Однако они не перечислены на странице Sympy Coredoc .

И я копался в самом исходном коде, но я не могу проследить и найти то, что я ищу.

4 4

4 ответа:

symbols() функция

Как отметили другие ответы - одно использование **args в symbols состоит в том, чтобы передать предположения о том, что Symbol создается. Список допущений, которые вы можете передать, задокументирован на страницедопущения Какподдерживаемые предикаты .

однако, следует также отметить, что некоторые другие специальные именованные аргументы могут быть переданы.

Они оба описаны в разделе, который вы связываете и являются:

  1. cls=<ClassName>

    Несмотря на свое название, symbols() может создавать символьные объекты, такие как экземпляры функций или диких классов. Для этого выберите ЦБС ключевое слово аргумент к нужному типу:

    N. B. Если не указано, используется класс по умолчанию Symbol.

  2. seq=<True|False>

    В документах говорится:

    Если для одного символа требуется итерационный контейнер, задайте seq аргумент к True или завершение символа имя с запятой

Кодовая прогулка

Вы заметили, что просмотрели код-поэтому я покажу вам, где они реализованы в коде. Если вы позвоните в symbols() функция, она делает различные проверки своих аргументов, включая pop-ing cls и seq аргументы из **args затем он выполняет дополнительные проверки и т. д., Прежде чем, наконец, вызвать для создания экземпляра Symbol здесь, здесь или здесь. Эти называют конструктор Symbol (или его подкласс, переданный через cls) с тем, что осталось в **args, которые все интерпретируются как assumptions в конструкторе. - они есть sanitized здесь т. е. неприменимые или неприменимые именованные аргументы выбрасываются в этот момент!

Это показывает, что допущения + cls + seq сформируйте набор именованных аргументов, которые можно передать из **args в symbols()


Другие функции (общий случай)

Это приходит мне в голову. это symbols(), возможно, просто послужило репрезентативным примером более общего вопроса. Я надеюсь, что вышеизложенное убедило вас в том, что все значения, которые могут быть с пользой переданы в symbols(), задокументированы. Это может дать вам некоторую уверенность в том, что то же самое верно и для других функций в рамках SymPy.

Однако в общем случае ответ заключается в том, что довольно трудно доказать самому себе, что все значения, которые могут быть переданы в качестве ключевых аргументов, находятся в документации любые библиотека или функция. Действительно, иногда только подмножество документируется намеренно, поскольку они являются" публичным API " для библиотеки, тогда как фактический код может принимать другие аргументы, но по какой - то причине разработчик не хочет предоставлять их общественности-например, потому, что их доступность может измениться, или их функциональность непроверена.

Если вы передаете недопустимые аргументы, поведение используемой библиотеки может отличаться. Некоторые библиотеки или функции будут игнорировать их, в то время как другие будут выдавать ошибки, если вы передадите недопустимые аргументы ключевого слова.

Если вы хотите выяснить, так ли это (и библиотека с открытым исходным кодом, как 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 возвращаемого объекта.