由于转换动态添加 is_* 属性,处理 mypy [attr-defined] 错误的正确方法是什么?

问题描述 投票:0回答:1

MRE

from transitions import Machine


class TradingSystem:
    def __init__(self):
        self.machine = Machine(model=self, states=['RUNNING'], initial='RUNNING')

    def check_running(self) -> None:
        if self.is_RUNNING():              
            print("System is running")

使用示例

system = TradingSystem()
system.check_running()

问题

mypy transitions_mypy.py

给出错误:

transitions_mypy.py:9: error: "TradingSystem" has no attribute "is_RUNNING"  [attr-defined]

可以通过绕过 mypy 来避免这种情况,例如在第 9 行末尾添加

# type: ignore[attr-defined]

但是什么是正确的方法呢?避免绕过 mypy 是否更好?也许通过手动定义属性?

python mypy python-typing pytransitions
1个回答
0
投票

首先,这是一个问题的原因是这个“转换”库确实行为不当 - 以这种方式从外部修改 self 并不完全是一个好的做法,例如如果某些东西在修改 self 时已经在使用

is_RUNNING
怎么办?

也就是说,有一种方法可以解决您的问题而无需类型忽略,您只需通过单独的接口模拟转换生成的方法即可。现在我在这里添加了

is_RUNNING
,但您也可以添加其他方法:

from transitions import Machine

class TransitionsInterface:
    def is_RUNNING(self) -> bool:
        ...
    

class TradingSystem(TransitionsInterface):
    def __init__(self):
        self.machine = Machine(model=self, states=['RUNNING'], initial='RUNNING')

    def check_running(self) -> None:
        if self.is_RUNNING():              
            print("System is running")

system = TradingSystem()
system.check_running()

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.