Есть ли способ заставить пользовательскую функцию Python действовать как встроенный оператор? - PullRequest
1 голос
/ 29 января 2009

Можно ли заставить пользовательскую функцию Python действовать как оператор? Другими словами, я бы хотел сказать:

myfunc

вместо:

myfunc()

и в любом случае его вызывают - так, как, скажем, print.

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

Ответы [ 7 ]

9 голосов
/ 29 января 2009

Нет, это невозможно.

Как видно из справочника по языкам , в спецификации нет места для расширения списка простых операторов.

Более того, print как оператор больше не существует в Python 3.0 и заменяется встроенной функцией print().

3 голосов
/ 29 января 2009

Я бы этого не реализовал, но если бы я это реализовывал, я бы дал коду с myfunc специальное расширение, напишу ловушку импорта для разбора файла, добавил бы скобки, чтобы сделать его допустимым Python, и передал это в интерпретатор. .

3 голосов
/ 29 января 2009

Если вам нужно добавить новое утверждение (например, print) в язык Python, то это будет непросто. Вам, вероятно, придется изменить лексер, парсер и затем перекомпилировать исходные тексты языка Python. Много работы для сомнительного удобства.

2 голосов
/ 29 января 2009

Нет, если вы хотите передать аргументы. Вы могли бы сделать что-то, чтобы построить объект, который ОШИБИТ метод __str__, но это настоятельно не рекомендуется. Вы также можете использовать другие операторы, например перегрузить оператор <<, как cout в C ++.

1 голос
/ 21 октября 2011

Невозможно запланированным образом или без большой работы.

Если вы смелы и предприимчивы, прочитайте эту статью в Википедии о мета круговой оценке. Python довольно хорошо просматривает и размышляет над своими собственными объектами компилятора / оценщика, вы можете что-то объединить в одном направлении.

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

Я полагаю, что Pypy делает что-то похожее, возможно, вы захотите посмотреть на это.

1 голос
/ 29 января 2009

В Python 2.x print - это не функция, а оператор, как если бы, а def и операторы.

0 голосов
/ 30 января 2009

Возможно, это не решит вашу проблему, но я все равно упомяну об этом. Если myfunc является частью модуля, и вы используете его следующим образом:

from mymodule import myfunc
myfunc # I want this to turn into a function call

Тогда вы могли бы вместо этого сделать это:

import mymodule
mymodule.myfunc # I want this to turn into a function call

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...