可调用实例参数的表示法是什么?

2024-09-28 19:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到最优雅的方法来帮助IntelliSense捕获可调用函数的预期参数集

考虑下面的代码:

class Box:
    def __init__(self, f: callable) -> None:
        self.f: callable = f

    def callF(self):
        self.f(self, 5, 6, 77, 65)

可以看到,参数中没有显式定义可调用对象f

我可以尝试与代表一起解决此问题:

from __future__ import annotations

class Box:

    class BoxFDelegate:
        def f(self, a:int, b:int, c:int, d:int):
            pass

    def __init__(self, f: Box.BoxFDelegate.f) -> None:
        self.f: Box.BoxFDelegate.f = f

    def callF(self):
        self.f(self, 5, 6, 77, 65)

委托模式很好,但它需要在代码体的其他地方对委托进行子类化:

class D(Box.BoxFDelegate):
    def f(self, a:int, b:int, c:int, d:int):
        ...

class Main:
    def boxing():
        boxDelegate = D()
        box = Box(boxDelegate)
        ...

作为委托的一种可能变体,是将委托方法包含到主类中的方法:

class Main(Box.BoxFDelegate):
    def boxing():
        box = Box(self.f)
        ...

    def f(self, a:int, b:int, c:int, d:int):
        ...

这个符号更短,但是如果我有许多不同的类Box实例呢

在完美的世界中,我可以通过以下方式解决这样的问题:

class Main(Box.BoxFDelegate):
    def boxing():
        boxes = [
                    Box(lambda a, b, c, d: ...),
                    Box(lambda a, b, c, d: ...),
                    Box(lambda a, b, c, d: ...),
                ]

不幸的是,这样的方式是只写的

如何在类型上简洁,而不被稍后试图维护代码的开发人员残酷地击败


Tags: 方法lambda代码selfbox参数initmain
1条回答
网友
1楼 · 发布于 2024-09-28 19:21:20

请看@superstorer的评论。结果应该是这样的:

from __future__ import annotations
from typing import Callable


class Box:
    def __init__(self, f: Callable[[Box, int, int, int, int], None]) -> None:
        self.f = f

    def call_f(self) -> None:
        self.f(self, 5, 6, 77, 65)

相关问题 更多 >