簡體   English   中英

如何在zope.interface中聲明@staticmethod

[英]How to declare @staticmethod in zope.interface

我嘗試使用@staticmethod和@classmethod創建接口。 聲明類方法很簡單。 但是我找不到聲明靜態方法的正確方法。

考慮類接口及其實現:

#!/usr/bin/python3
from zope.interface import Interface, implementer, verify


class ISerializable(Interface):

    def from_dump(slice_id, intex_list, input_stream):
        '''Loads from dump.'''

    def dump(out_stream):
        '''Writes dump.'''

    def load_index_list(input_stream):
        '''staticmethod'''


@implementer(ISerializable)
class MyObject(object):

    def dump(self, out_stream):
        pass

    @classmethod
    def from_dump(cls, slice_id, intex_list, input_stream):
        return cls()

    @staticmethod
    def load_index_list(stream):
        pass

verify.verifyClass(ISerializable, MyObject)
verify.verifyObject(ISerializable, MyObject())
verify.verifyObject(ISerializable, MyObject.from_dump(0, [], 'stream'))

輸出:

Traceback (most recent call last):
  File "./test-interface.py", line 31, in <module>
    verify.verifyClass(ISerializable, MyObject)
  File "/usr/local/lib/python3.4/dist-packages/zope/interface/verify.py", line 102, in verifyClass
    return _verify(iface, candidate, tentative, vtype='c')
  File "/usr/local/lib/python3.4/dist-packages/zope/interface/verify.py", line 97, in _verify
    raise BrokenMethodImplementation(name, mess)
zope.interface.exceptions.BrokenMethodImplementation: The implementation of load_index_list violates its contract
        because implementation doesn't allow enough arguments.

我應該如何在此接口中正確聲明靜態方法?

顯然, verifyClass不能正確地理解classmethodstaticmethod 問題在於,在Python 3中,如果在Python 3中執行getattr(MyObject, 'load_index_list') ,則會得到一個裸函數,並且verifyClass認為這是另一個未綁定的方法 ,然后期望隱式self是第一個參數。

最簡單的解決方法是在其中使用classmethod ,而不是staticmethod

我猜有人也可以報告錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM