代码之家  ›  专栏  ›  技术社区  ›  Gautzilla

Pycharm静态分析不能像我希望的那样推断子类类型

  •  0
  • Gautzilla  · 技术社区  · 8 月前

    在下面的python代码中 TruckDriver 类继承自 Driver 类,和 Truck 类继承自 Vehicle 类。

    这个 driver 属性 卡车 类是 卡车司机 类型(在类型提示中指定),并传递给 车辆 类(接受一般 司机 类型)。

    然而,Pycharm在 卡车 类关于 司机 没有 卡车司机 -具体属性。具体而言,它强调了 company 属性在 print(f"Company: {self.driver.company}") 行,并带有以下警告:

    类“Driver”的未解析属性引用“company”

    我有办法解决这些警告吗?我在项目中也使用Ruff作为过梁,但在这里似乎没有帮助。

    class Driver:
        def __init__(self, name: str):
            self.name = name
    
    class TruckDriver(Driver):
        def __init__(self, name: str, company: str):
            super().__init__(name)
            self.company = company
    
    class Vehicle:
        def __init__(self, driver: Driver):
            self.driver = driver
    
        def drive(self):
            print(f"{self.driver.name} is driving.")
    
    class Truck(Vehicle):
        def __init__(self, driver: TruckDriver):
            super().__init__(driver)
    
        def drive(self):
            super().drive()
            print(f"Company: {self.driver.company}")
    
    1 回复  |  直到 8 月前
        1
  •  1
  •   MT0    8 月前

    使用通用车辆:

    from typing import Generic, TypeVar
    
    D = TypeVar("D", bound="Driver")
    
    class Driver:
        def __init__(self, name: str):
            self.name = name
    
    class TruckDriver(Driver):
        def __init__(self, name: str, company: str):
            super().__init__(name)
            self.company = company
    
    class Vehicle(Generic[D]):
        def __init__(self, driver: D):
            self.driver = driver
    
        def drive(self):
            print(f"{self.driver.name} is driving.")
    
    class Truck(Vehicle[TruckDriver]):
        def __init__(self, driver: TruckDriver):
            super().__init__(driver)
    
        def drive(self):
            super().drive()
            print(f"Company: {self.driver.company}")
    
    alice = Driver("Alice")
    carol = TruckDriver("Carol", "Acme Truck Co.")
    
    car = Vehicle(alice)
    truck = Truck(carol)
    
    car.drive()
    truck.drive()