-1

以及如何定义我自己的变量/对象类型以与 python 中提供的操作一起运行?

我可以在不必创建自己的对象类和运算符作为单独且不同的实体的情况下执行此操作吗?我不介意必须创建自己的对象类(这是给定的),但我希望它与现有的构造完美集成。所以强调我希望避免“分离和不同”。

我试图创建一个四元数对象类。我想定义一个与 1j 不同的 1i 和 1k。

是的,一个包可能已经存在;这纯粹是学术性的,也是为了我自己的编程实践和理解。我试图扩展已经存在的东西,而不是构建独特而独立的东西。

我已经做了类对象,但不幸的是它们需要重新定义基本操作才能使用它们,即使这样我也必须在使用它们之前“声明”这些对象,这与“1j”完全不同。

我希望我清楚我的意图。四元数的最终结果不是我的意图。它是方法和对象的类型和概括我试图弄清楚如何去做、扩展和利用已经内置在 python 中的东西。

在我看来,构建 numpy 和 cmath 的人已经能够实现这一目标。


感谢下面的评论。我现在有了更好地表达我的意图的词汇。

我正在尝试向 Pythons SYNTAX 添加新功能。

如果有人可以提供有关如何执行此操作的资源,我将不胜感激。

4

2 回答 2

0

我在这里看到两个选项:

  1. 更改 Python 语法(fork CPython),关于如何做到这一点的文章数量惊人。
  2. 构建某种预处理器,例如Mypy

无论哪种方式,仅仅拥有一个新的文字值似乎太麻烦了。

于 2018-08-30T18:52:46.673 回答
0

Python 不支持自定义运算符或自定义文字。

支持自定义文字的语言是 C++(我相信是 C++11),但它不支持自定义运算符。

例如,支持自定义运算符的语言是 Haskell。

如果您想将此功能添加到 Python,您必须获取 Python 源代码、修改其语法、修改词法分析器/解析器,更重要的是修改编译器。

但是,此时您只是创建了一种新语言,这意味着您破坏了与 python 的兼容性。

最简单的解决方案就是编写一个简单的预处理器,用扩展的等价物替换一些简单的语法。例如:

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

然后,您可以在库/应用程序的构建步骤中执行预处理器。

这样做的好处是可以让你编写你想要的代码,但是当你发布/使用它时,它会被翻译成普通的 python,与现有的安装保持 100% 的兼容性。

我相信使用导入钩子可以避免发送库的预处理版本......基本上预处理器可以包含在导入步骤中并即时完成。这将避免必须处理临时预处理文件。

唯一的要求是需要使用您的库的人必须以某种方式安装导入钩子。

于 2018-08-30T18:56:49.347 回答