【问题标题】:Pylint yelling about cls parameter in meta classPylint 对元类中的 cls 参数大喊大叫
【发布时间】:2018-12-21 07:43:41
【问题描述】:

我第一次在这里编写元类。这很简单,因为我需要它来处理特定的情况,但是就这样吧。

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

【问题讨论】:

  • 我很确定“错误”在下一行(调用create_contract_interfacecreate_instance)。在我看来,这仍然是一个误报。

标签: python metaclass pylint


【解决方案1】:

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

我的建议是在调用cls.create_contract_interface()cls.create_instance() 的行中添加# noQA 注释,然后继续 -

记住>linter 应该是帮助者,但由于它们无法了解 Python 等动态语言中的所有可能性,因此在这种情况下,linter 会阻碍您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2019-04-10
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多