Python: Как определяются объекты / переменные, такие как комплекс '1j'? - PullRequest
0 голосов
/ 30 августа 2018

А как я могу определить свои собственные типы переменных / объектов, которые будут работать с предоставленными операциями в python?

Могу ли я сделать это, не создавая свои собственные классы объектов и операторы как отдельную и отличную сущность? Я не против создать свой собственный объектный класс (то есть данный), но я хочу, чтобы он безупречно интегрировался с уже существующими конструкциями. Поэтому акцент на моем желании избежать «отдельного и отличного».

Я пытаюсь создать класс объектов кватернионов. Я хочу определить 1i и 1k, которые отличаются от 1j.

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

Я уже делаю объекты класса, но, к сожалению, они требуют переопределения базовых операций, чтобы их использовать, и даже тогда мне приходится «объявлять» эти объекты, прежде чем я смогу их использовать, в отличие от «1j».

Я надеюсь, что я ясен со своим намерением. Конечный результат кватерниона не является моим намерением; Это типы методов, объектов и обобщений. Я пытаюсь понять, как это сделать, расширить и использовать то, что уже встроено в python.

Мне кажется, тот, кто построил numy и cmath, уже смог достичь этой цели.


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

Я пытаюсь добавить новые функции в Синтаксис Pythons.

Если кто-то может предложить ресурсы о том, как это сделать, я буду признателен.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Python не поддерживает ни пользовательские операторы, ни пользовательские литералы.

Язык, который поддерживает пользовательские литералы, - это C ++ (начиная с C ++ 11, я считаю), но он не поддерживает пользовательские операторы.

Язык, который поддерживает пользовательские операторы, например, Haskell.

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

Однако в этот момент вы просто создаете новый язык, что означает, что вы нарушили совместимость с python.

Самым простым решением было бы просто написать простой препроцессор, который заменяет некоторый простой синтаксис расширенным эквивалентом. Например:

sed -i 's/(\d)+\+(\d+)i/MyComplex(\1, \2)/g' my_file.py

Затем вы можете запустить препроцессор на этапе сборки вашей библиотеки / приложения.

Преимущество этого состоит в том, что вы можете написать нужный код, но когда вы его отправляете / используете, он переводится в обычный Python, сохраняя 100% совместимость с существующими установками.

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

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

0 голосов
/ 30 августа 2018

Я вижу для вас два варианта:

  1. Измените синтаксис Python (форк CPython), есть удивительное количество статей о том, как это сделать.
  2. Создайте какой-нибудь препроцессор, такой как Mypy .

В любом случае кажется слишком сложным просто иметь новое буквальное значение.

...