【问题标题】:Using classname in Python class function for callbacks causes warning在 Python 类函数中使用类名进行回调会导致警告
【发布时间】:2022-12-10 19:27:34
【问题描述】:

我有一个关于在其内部使用 Python 类名的问题。我正在制作一个 Python TCP 套接字包装器,它处理 TCP 客户端之间的消息,并触发对可以使用 onMessage() 函数订阅它的其他类的回调。其他类可以通过传递接收消息的回调函数和对 TCP 客户端包装器的引用(以便能够在需要时响应)来订阅传入的 TCP 消息。回调的格式为Callback[[str, TCPClient]],其中 TCPClient 是套接字的包装器。

Visual Studio Code 以某种方式无法识别回调类型提示中的 TCPClient 类。它提到:"TCPClient" is not defined Pylance (reportUndefinedVariable)。它可以很好地识别其他类,甚至是 TCPClient 类所基于的 Thread 类。绕过它的唯一方法是在 TCPClient 文件本身中添加 TCPClient(我认为这很糟糕)。

来自 TCPClient 的一些代码 sn-p 更好地显示了问题。 VS Code 在onMessage 的回调中无法识别 TCPClient:

class TCPClient(Thread):
    """TCP Client wrapper that handles and adds functionality to raw TCP client sockets."""
    
    # ... Constructor and message handling code left out..

    def onMessage(self, callback:Callable[[str, TCPClient]]):
        self._callbacks.append(callback)

如果我在其内部导入 TCPClient,错误只会消失。为什么会这样?

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用引号进行此类键入。如果您在几种类型之间存在循环依赖,通常需要它。

    另外,不要忘记定义可调用的返回类型,因为正确的语法是Callable[[arg, ...], result]

    from threading import Thread
    from typing import Callable
    
    
    class TCPClient(Thread):
        """TCP Client wrapper that handles and adds functionality to raw TCP client sockets."""
    
        # ... Constructor and message handling code left out..
    
        def onMessage(self, callback: Callable[[str, 'TCPClient'], object]):
            self._callbacks.append(callback)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-17
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多