有没有一种内置的方法来定义接受1个参数或3个参数的函数?

2024-04-23 18:42:26 发布

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

在没有参数的情况下调用builtin type()时,Python中存在以下错误:

TypeError: type() takes 1 or 3 arguments

我们如何定义这种方法? 有内置的方法吗?或者我们需要这样做:

^{pr2}$

Tags: or方法参数定义type错误情况arguments
2条回答

首先,类型不是原生Python(至少在CPython中),而是C

inspect模块可以很容易地确认它(即使记录为一个内置函数,type在CPython中实现为一个类):

>>> print(inspect.signature(type.__init__))
(self, /, *args, **kwargs)
>>> print(sig.parameters['self'].kind)
POSITIONAL_ONLY

参数类型是POSITIONAL_ONLY,不能在Python中创建。在

这意味着不可能精确地再现类型的行为。在

Python source只允许2个签名用于可变数量的参数:

  • 3个参数,其中2个可选:

    ^{pr2}$

    这将是非常不同的,因为它会欣然接受type(obj, None),这绝对不是这里所期望的

  • 一个简单的*args参数,其长度将由手工测试。这将更接近于本机type行为,因为它实际上需要1到3个参数,无论值是什么。

TL/DR:你的问题的答案是我们真的需要这样的方式。在

这种行为在Python中是完全可能的。在

def one_or_three(one, two=object(), three=object()):
    two_sentinel, three_sentinel = one_or_three.__defaults__
    if (two == two_sentinel) != (three == three_sentinel):
        raise TypeError("one_or_three() takes 1 or 3 arguments")
    ...

这有命名参数(语义值、按名称传入等)的优点,但基本上是检查某些变量的值以了解传递的是一个还是三个事物的变体。在

请注意,对object()的两个调用生成两个不同的对象并将它们绑定到函数:

^{pr2}$

这样,它们在全球都是独一无二的。如果使用None作为sentinel对象,那么就不可能将None作为参数传入(当然,这可能是需要的)。在

相关问题 更多 >