我试图找到最优雅的方法来帮助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: ...),
]
不幸的是,这样的方式是只写的
如何在类型上简洁,而不被稍后试图维护代码的开发人员残酷地击败
请看@superstorer的评论。结果应该是这样的:
相关问题 更多 >
编程相关推荐