如何在python中定义自己的前缀和后缀运算符

2024-05-16 13:02:58 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是前一个问题(Python: defining my own operators?)的扩展。我非常喜欢中缀运算符的solution provided there,但对于我的表达式,我需要一种以类似方式定义自定义一元运算符的方法。在

你有什么建议吗?重用现有的python操作符没有帮助,因为我已经把它们都用光了。非常感谢你的帮助!在

执行此重载的主要原因是Python中缺少以下一元运算符: (不超过0) (大于等于0) 我需要运算符来区分这两种类型的操作,我的要求是尽可能使我的接口与预定义语言提供的接口匹配,该语言带有自己的运算符集。我本可以选择将运算符替换为>;0和>;=0,但这在用户社区中并不受欢迎。有更好的方法吗?在


Tags: 方法gt定义表达式my方式运算符建议
1条回答
网友
1楼 · 发布于 2024-05-16 13:02:58

你可以用同样的方法:

#! /usr/bin/python3.2

class Postfix:
    def __init__(self, f):
        self.f = f

    def __ror__(self, other):
        return self.f(other)

x = Postfix(lambda x: x * 2)

a = 'Hello'
print(a |x)
a = 23
print(a |x |x)

不过,我不主张使用它,因为它只会让人困惑。在

编辑:特别是当你的操作符是一元的时候,你可以简单地调用一个函数,任何阅读你的代码的人都会立即理解它的作用。在

^{pr2}$

编辑2:亲爱的那些对PEP-8信教的人:这个“操作员”黑客攻击是关于不遵守PEP-8的,所以请停止编辑答案。其思想是|op读起来就像一个实体,基本上是一个后缀运算符。在


编辑3:仔细考虑一下这个黑客可能会派上用场的案例,也许下面的方法是一个明智的使用。(如果且仅当此功能在API中有很好的文档记录):

#! /usr/bin/python3.2

class Language:
    def __init__(self, d):
        self.d = d

    def __ror__(self, string):
        try: return self.d[string]
        except: return string

enUS = Language({})
esMX = Language({'yes': 'sí', 'cancel': 'cancelar'})
deDE = Language({'yes': 'ja', 'no': 'nein', 'cancel': 'abbrechen'})

print('yes' |enUS)
print('no' |deDE)
print('cancel' |esMX)

相关问题 更多 >