我第一次在这里编写一个元类。这是简单的一面,因为我需要在特定情况下使用它,但这是可行的。
Pylint专门在下面注释的行上引发此错误no-value-for-parameter / No value for argument 'cls' in unbound method call
。
这是我的代码
class ContractType(type):
_instance = None
_contract_interface = None
def create_contract_interface(cls):
contract_json = open(str(settings.CONTRACT_DIR + cls.token_name)).read()
cls._contract_interface = json.loads(contract_json)
return cls._contract_interface
def create_instance(cls):
cls._instance = w3.eth.contract(abi=cls._contract_interface['abi'], bytecode=cls._contract_interface['bytecode'])
return cls._instance
def __getattr__(cls, key):
if not cls._contract_interface: # This line is failing pylint
cls.create_contract_interface()
if not cls._instance: # This line is failing pylint
cls.create_instance()
if key == "contract_interface":
return cls._contract_interface
return getattr(cls._instance, key, None)
class Tempo(metaclass=ContractType):
token_name = 'TempoToken.json'
有人知道为什么pylint会引发此错误吗?该代码按预期工作。我发现了这个问题here,但这不完全是我的情况。
答案 0 :(得分:0)
这是一个pylint错误-上面的代码正确。问题在于,在编写元类代码时,将传统的self
第一个参数替换为cls
是很有意义的,而pylint的self
名称是硬编码的,因此无法“看到“被调用的方法使用cls
代替self
作为其自动参数的名称。如果它是self
,它将“知道”不需要任何参数。
我的建议是仅在调用# noQA
和cls.create_contract_interface()
的行中添加cls.create_instance()
注释并继续-
记住>短绒棉应该是帮手,但由于他们不了解Python等动态语言的所有可能性,因此在这种情况下,短绒棉会妨碍您。