Skip to main content
 首页 » 编程设计

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

2025年05月04日11birdshome

此问题是上一个问题 (Python: defining my own operators?) 的延伸。我真的很喜欢 solution provided there对于中缀运算符,但对于我的表达式,我需要一种方法来以类似的方式定义自定义一元运算符。

您有什么建议吗?重用现有的 python 运算符没有帮助,因为我已经用完了它们。非常感谢您的帮助!

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

请您参考如下方法:

好吧,你可以使用相同的技巧:

#! /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) 

不过,我不提倡使用它,因为它只会让人感到困惑。

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

def choose(t): pass 
    #magic happens here and returns nCr(t[0], t[1]) 
 
nCr = Postfix(choose) 
 
#This is unintuitive: 
print((3, 4) |nCr) 
 
nCr = choose 
 
#But this is obvious: 
print(nCr((3, 4))) 

Edit2:亲爱的 PEP-8 信徒:这个“运算符(operator)”-hack 完全是为了不遵守 PEP-8,所以请停止编辑答案。这个想法是 |op 像一个实体一样被读取,基本上是一个后缀运算符。


编辑 3:认真思考这个 hack 可以派上用场的情况,也许以下可能是一个半途而废的使用。 (当且仅当此功能在 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)