gpt4 book ai didi

python - 如何判断 PyObject 的类型?

转载 作者:行者123 更新时间:2023-12-03 19:42:06 26 4
gpt4 key购买 nike

我正在编写一个 C 函数,它将 PyObject* 作为参数并根据数据类型对其进行处理。例如。如果它是一个字符串、一个整数、一个 double 数、一个列表等。
我正在寻找检查数据类型的方法,你能给我举一些例子吗?
我正在使用 CPython 3.8。

最佳答案

Python 中的大多数内置类型都有相关的类型检查函数,您可以在 docs 中查找。 .例如,PyLong_Check检查对象是否为 int(接受子类),以及 PyLong_CheckExact做同样的检查,但拒绝子类:

if (PyLong_Check(whatever)) {
// do int stuff
}

还有 type 的C 级等效项和 isinstance .
要在 C 中访问对象的类型,可以使用 Py_TYPE(whatever) .这为您提供了对对象类型的借用引用 - 它相当于访问对象的 ob_type field 。该值的类型为 PyTypeObject* ;你可以把它投给 PyObject*如果你需要。
或者,如果您需要新的引用,您可以使用 PyObject_Type(whatever) .这给你一个 PyObject* ;您可以将其转换为 PyTypeObject*如果你需要。 (指针类型的差异与引用计数处理的差异无关。)

有两种方式做 isinstance在 C 级,取决于你真正想要什么。第一个是 PyObject_IsInstance(whatever, WhateverClass) ,完全等同于 isinstance ,包括处理虚拟子类和 false __class__属性方式 isinstance确实,并将类的元组作为第二个参数处理。这通常不是你在 C 级别真正想要的,因为通过了 PyObject_IsInstance test 不保证对象的内存布局。
第二个是 PyObject_TypeCheck(whatever, WhateverClass) ,这需要 whateverWhateverClass 的“具体”实例- 实际类型 whatever必须是 WhateverClassWhateverClass 的“真正”后代.这确保了 whatever具有实际的 C 级成员 WhateverClass 的实例预计会有。
例如,使用以下类:
import abc

class A(metaclass=abc.ABCMeta):
pass

class B: pass

A.register(B)

class C:
__class__ = int

b = B()
c = C()
PyObject_IsInstance(b, A)PyObject_IsInstance(c, int)两者都是真的,但是 PyObject_TypeCheck(b, A)PyObject_TypeCheck(c, int)会是假的。
特定于类型的类型检查宏,如 PyLong_Check表现得像 PyObject_TypeCheck ,不是 PyObject_IsInstance .他们忽略虚拟子类和 false __class__属性。

关于python - 如何判断 PyObject 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62737289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com