此问题是上一个问题 (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)
