【问题标题】:How to type python class factory with linter?如何用 linter 输入 python 类工厂?
【发布时间】:2022-10-01 12:01:07
【问题描述】:

我有这个代码

from abc import ABC
from typing import Type


class AbstractFoo(ABC):
    \"\"\"Abstract foo.\"\"\"
    foo_attr: int


def foo_factory(foo_attr_val: int) -> type[AbstractFoo]:

    class Foo(AbstractFoo):
        foo_attr = foo_attr_val

    return Foo


FooA = foo_factory(5)


class FooB(FooA):
    \"\"\"Public concrete foo.\"\"\"

print(FooB.5)

这执行得很好,但是我用mypy foo.py 运行mypy,我得到一个看起来像的错误

foo.py:21: error: Variable \"foo.FooA\" is not valid as a type
foo.py:21: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
foo.py:21: error: Invalid base class \"FooA\"
Found 2 errors in 1 file (checked 1 source file)

我不明白这里有什么问题以及为什么这种类型无效。解决这个问题的方法是什么?

我目前使用的是 Python 3.9,mypy 版本为 0.971。

    标签: python factory mypy linter


    【解决方案1】:

    我能够让它在我的 MAC 上与 python 3.10 一起工作:

    class AbstractFoo:
        foo_attr: int
    
    def foo_factory(foo_attr: int) -> type[AbstractFoo]:
    
        class Foo(AbstractFoo):
            AbstractFoo.foo_attr=foo_attr
    
        return Foo
    
    
    FooA = foo_factory(5)
    
    class FooB(FooA):
      pass
    

    我做了两个改变:

    1. 类型 -> 类型
    2. foo_attr --> AbstractFoo.foo_attr

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多