在 pdb 模式下,我经常想进入一个函数。这是一个说明我可能会做的事情的情况。鉴于代码:
def f(x):
print('doing important stuff..')
result = g(x) + 2
return result
def g(x):
print('some cool stuff going on here, as well')
0 / 0 # oops! a bug
return x + 5
Run Code Online (Sandbox Code Playgroud)
现在,假设我在print('doing important stuff...')和之间设置了一个断点result = g(x) + 2。所以现在,f(x)看起来像这样:
def f(x):
print('doing important stuff..')
__import__('pdb').set_trace() # or something similar..
result = g(x) + 2
return result
Run Code Online (Sandbox Code Playgroud)
然后,我调用该函数f(x)用x=5,期待得到一个结果12。当被调用时,我最终在f. 命中n会给我错误(在这种情况下是 ZeroDivisionError)。现在,我想以g(x) …
我有什么方法可以对 a 应用转换ParamSpec吗?我可以用一个例子来说明这个问题:
from typing import Callable
def as_upper(x: str):
return x.upper()
def eventually(f: Callable[P, None], *args: P.args, **kwargs: P.kwargs):
def inner():
def transform(a):
return a() if isinstance(a, Callable) else a
targs = tuple(transform(a) for a in args)
tkwargs = {k: transform(v) for k,v in kwargs.items()}
return f(*targs, **tkwargs)
return inner
eventually(as_upper, lambda: "hello") # type checker complains here
Run Code Online (Sandbox Code Playgroud)
这个类型检查器(在我的例子中是pyright)会抱怨这一点。该函数eventually收到了一个可调用函数() -> str,而不是str预期的一个。我的问题是:有什么方法可以让我指定它应该期望() -> str而不是它str本身?一般来说,如果一个函数需要一个类型,T我可以将它转换为(比如说)() -> …