我設計了一個Python庫的API,並已經運行到一個情況,我想我的想象有可能超越Python的相當大的能力。Python API - 創建可選括號的模式?
(我要道歉,誰可能會通過我的設計的紅寶石岬得罪任何Pythonistas)
基本上,有一個與它的一些方法,每個返回self
一類,使他們可以鏈接在一起。所以:
>>> a = MyKlass()
>>> b = a.method_one()
>>> c = b.method_two()
將是相同
>>> a = MyKlass()
>>> c = a.method_one().method_two()
我的問題是,是否有可能使括號可選。我已經瞭解了一些關於使用__getattr__
和__call__
來操縱可調用對象的知識,但尚未能完全實現這一點。現在,我有類的__getattr__
對於屬性檢查,然後確定是否name
是一個方法或屬性(或者更準確地說,無論是贖回與否)。
我的問題是,如果它是一個可調用的,我需要__getattr__
做這樣的事情:
>>> class MyKlass(object):
>>> def __getattr__(self, name):
>>> # pseudocode, you get the idea...
>>> if name is callable:
>>> def callme(*args, **kwds):
>>> # do stuff
>>> return callme
>>> else:
>>> # just return the attribute
所以Callable對象。這意味着,雖然,我不能讓括號可選的,因爲可調用對象將返回,但從來沒有叫:
>>> a = MyKlass()
>>> c = a.method_one.method_two # AttributeError, since a bound function object does not have attribute "method_two"
我認爲只有這樣,才能做到這一點是要能夠「在代碼中向前看「,並確定name
後面是否包含括號。然後,如果name
可調用但未調用,則可返回調用name
而不帶參數而不返回可調用對象的結果。
我想,這可能是不可行的,但我想我會問大師呢。
如果它不是一個屬性,那麼它不應該被隱式調用。不要那樣做,永遠。特別是在圖書館。 Python不是Ruby。 –
是的...這是沒有用的,並可能會導致大量的混淆,那些誰會使用你的圖書館 – Ant
我聽到你大聲清晰。我將@ FogleBird的答案標記爲公認的答案,但我很感謝你們所有人都將我放在了直線和狹窄的地方。 –