-2

首先,我是stackoverflow的超级新手,对如何提问以及所有问题都不太了解,所以请原谅我犯的任何重大错误。

无论如何,我目前正在尝试为函数创建一种引用自身的方法。为此,我创建了一个如下所示的包装器:

def custom_self(func):
    def wrapped(*args, **kwargs):
        return func(func, *args, **kwargs)
    return wrapped

老实说,相当标准的东西。我现在可以使用这个包装器作为任何应该引用自身的新函数的装饰器。但是,我使用 Visual Studio Code 作为编辑器,每当我将鼠标悬停在我的新函数上时,它都会显示如下内容:

截图(对不起,我显然还不允许添加图片)

现在,如您所见,代码镜头显示了函数所需的所有参数。但是,这包括参数“own”,它应该是对函数本身的引用。因此,它不是一个参数,您实际上可以传递给函数,类似于类方法的工作方式。我现在的问题是:我怎样才能使代码镜头只显示参数'arg_1'和'arg_2'?

这是显示的内容。正如您所看到的,编辑器认为我在传递参数 'arg_1' 时认为我传递了参数 'own'。代码按我想要的方式工作,但显示有点失败。)

我已经尝试使用 'typing.overload' 作为装饰器,如下所示:

@typing.overload
def new_func(arg_1, arg_2): ...

@custom_self
def new_func(own, arg_1, arg_2):
    own.arg_1 = arg_1
    own.arg_2 = arg_2
    ...

这行得通,代码镜头现在只显示 'arg_1' 和 'arg_2' 作为参数,但老实说,这不是一个非常漂亮的解决方案,因为这意味着我必须为每个自引用函数创建一个虚拟对象,并且我我猜还必须声明每个函数两次,这使得它不那么“pythonic”。

我也尝试过装饰“custom_self”功能,但这也没有让我得到想要的结果。

同样,代码工作正常,这只是一个显示错误。但这是一个相当烦人的。

4

1 回答 1

0

镜头表示own, arg_1, arg_2,因为这是装饰之前功能的实际签名。
而且我猜VS Code不会象征性地执行装饰器代码来确定实际签名将只是arg_1, arg_2因为own将动态提供。
你一次要求太多了。

如果没有为每个函数指定最终签名(这不是您想要的),除了对 IDE 的扩展(这将是矫枉过正)之外,我看不出如何实现这一点。

于 2021-09-27T11:40:49.220 回答