python - 防止从 Python 调用 C 类型

标签 python cpython

防止从 Python 调用(创建 C 类型的实例)的正确方法是什么?

我考虑过提供一个引发异常的tp_init,但据我了解,仍然允许直接在该类型上调用__new__

C 函数返回该类型的实例——这是创建该类型实例的唯一方法。

编辑:我的目的是,如果我类型的用户不小心错误地使用它,他们将得到一个异常(exception)。 C 代码是这样的,在从 Python 错误创建的对象上调用函数会崩溃。我意识到这很不寻常:到目前为止,我的所有 C 扩展类型在从 Python 实例化时都运行良好。我的问题是是否有一种常用的方法来提供此限制。

最佳答案

简单:将类型的 tp_new 槽保留为空。

>>> Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'foo.Foo' instances
>>> Foo.__new__(Foo)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object.__new__(foo.Foo) is not safe, use foo.Foo.__new__()

如果您继承自基本对象类型以外的类型,则必须在调用 PyType_Ready() 后将 tp_new 设置为 NULL。

关于python - 防止从 Python 调用 C 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079690/

相关文章:

python - PyGame rect.move 运动无法正常运行

cpython - Python 3.8.0a3 获取文件系统编码的Python编解码器失败

python - Python 的 `file.read` 函数如何计算出文件的大小?

python - PyCFunction_New/PyCFunction_NewEx的文档

python - 更新对象时,我怎么称呼? session.add 是添加,update 在哪里?

python - 在单个特征数据框中查找质心和点之间的距离 - KMeans

python - 在空列表上使用 .insert

python - 为什么对 Python 值(即函数参数)的引用存储在 CPython 中的堆栈(帧)上?

python - PyModule_New 的目的和用法

python - Pandas :在 2 个索引值之间随机拆分索引值