簡體   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