繁体   English   中英

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

[英]how do I define my own prefix and postfix operators in python

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

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

进行此重载的主要原因是Python中缺少以下一元运算符:(Is> 0)(Is> = 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持虔诚态度的人:此“操作员”黑客是关于不遵守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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM