2024-04-23 18:42:26 发布
网友
在没有参数的情况下调用builtin type()时,Python中存在以下错误:
type()
TypeError: type() takes 1 or 3 arguments
我们如何定义这种方法? 有内置的方法吗?或者我们需要这样做:
首先,类型不是原生Python(至少在CPython中),而是C
inspect模块可以很容易地确认它(即使记录为一个内置函数,type在CPython中实现为一个类):
inspect
type
>>> print(inspect.signature(type.__init__)) (self, /, *args, **kwargs) >>> print(sig.parameters['self'].kind) POSITIONAL_ONLY
参数类型是POSITIONAL_ONLY,不能在Python中创建。在
POSITIONAL_ONLY
这意味着不可能精确地再现类型的行为。在
Python source只允许2个签名用于可变数量的参数:
3个参数,其中2个可选:
这将是非常不同的,因为它会欣然接受type(obj, None),这绝对不是这里所期望的
type(obj, None)
一个简单的*args参数,其长度将由手工测试。这将更接近于本机type行为,因为它实际上需要1到3个参数,无论值是什么。
*args
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()的两个调用生成两个不同的对象并将它们绑定到函数:
object()
这样,它们在全球都是独一无二的。如果使用None作为sentinel对象,那么就不可能将None作为参数传入(当然,这可能是需要的)。在
None
首先,类型不是原生Python(至少在CPython中),而是C
inspect
模块可以很容易地确认它(即使记录为一个内置函数,type
在CPython中实现为一个类):参数类型是
POSITIONAL_ONLY
,不能在Python中创建。在这意味着不可能精确地再现类型的行为。在
Python source只允许2个签名用于可变数量的参数:
3个参数,其中2个可选:
^{pr2}$这将是非常不同的,因为它会欣然接受
type(obj, None)
,这绝对不是这里所期望的一个简单的
*args
参数,其长度将由手工测试。这将更接近于本机type
行为,因为它实际上需要1到3个参数,无论值是什么。TL/DR:你的问题的答案是我们真的需要这样的方式。在
这种行为在Python中是完全可能的。在
这有命名参数(语义值、按名称传入等)的优点,但基本上是检查某些变量的值以了解传递的是一个还是三个事物的变体。在
请注意,对
^{pr2}$object()
的两个调用生成两个不同的对象并将它们绑定到函数:这样,它们在全球都是独一无二的。如果使用
None
作为sentinel对象,那么就不可能将None
作为参数传入(当然,这可能是需要的)。在相关问题 更多 >
编程相关推荐