2

这个问题是对上一个问题( Python:定义我自己的操作符?)的扩展。我真的很喜欢为中缀运算符提供的解决方案,但对于我的表达式,我需要一种以类似方式定义自定义一元运算符的方法。

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

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

4

1 回答 1

1

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

#! /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 有宗教信仰的人:这个“操作员”-hack 完全是关于不遵守 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)
于 2013-11-06T17:25:26.307 回答