Pylint大喊大叫类中的cls参数

时间:2018-07-13 01:16:28

标签: python metaclass pylint

我第一次在这里编写一个元类。这是简单的一面,因为我需要在特定情况下使用它,但这是可行的。

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,但这不完全是我的情况。

1 个答案:

答案 0 :(得分:0)

这是一个pylint错误-上面的代码正确。问题在于,在编写元类代码时,将传统的self第一个参数替换为cls是很有意义的,而pylint的self名称是硬编码的,因此无法“看到“被调用的方法使用cls代替self作为其自动参数的名称。如果它是self,它将“知道”不需要任何参数。

我的建议是仅在调用# noQAcls.create_contract_interface()的行中添加cls.create_instance()注释并继续-

记住>短绒棉应该是帮手,但由于他们不了解Python等动态语言的所有可能性,因此在这种情况下,短绒棉会妨碍您。