- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面的 python-c 代码可以正确编译
#include <Python.h>
#include <structmember.h>
struct rangerr {
long min;
long max;
};
//Python type to represent rangerr
struct py_rangerr {
PyObject_HEAD
struct rangerr range;
};
// * get & set methods for py_rangerr
static PyObject * py_rangerr_min_get(struct py_rangerr *self) {
self->range.min = 1;
return PyLong_FromLong(self->range.min);
}
static PyObject * py_rangerr_min_set(struct py_rangerr *self) {
printf("Setter called");
self->range.min = 1;
}
static PyObject * py_rangerr_max_get(struct py_rangerr *self) {
self->range.max = 10;
return PyLong_FromLong(self->range.max);
}
//* GetSet method definition for py_rangerr
static PyGetSetDef py_rangerr_getset[] = {
{"min",(getter)py_rangerr_min_get, (setter)py_rangerr_min_set, "min",NULL},
{"max",(getter)py_rangerr_max_get, NULL, "max",NULL},
/* Sentinel */
{NULL},
};
/******************************************************************************
*/
static void py_rangerr_dealloc(struct py_rangerr *self) {
self->ob_type->tp_free((PyObject *)self);
}
static PyTypeObject py_rangerr_type = {
PyObject_HEAD_INIT(NULL)
.tp_name = "rangerr",
.tp_basicsize = sizeof(struct py_rangerr),
.tp_dealloc = (destructor) py_rangerr_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_alloc = PyType_GenericAlloc,
.tp_doc = "rangerr",
.tp_getset = py_rangerr_getset,
};
void
initrangerr(void)
{
PyObject* mod;
mod = Py_InitModule3("rangerr", NULL, "An extension with a type.");
if (mod == NULL) {
return;
}
py_rangerr_type.tp_new = PyType_GenericNew;
if (PyType_Ready(&py_rangerr_type) < 0){
return;
}
Py_INCREF(&py_rangerr_type);
PyModule_AddObject(mod, "rangerr", (PyObject*)&py_rangerr_type);
}
但是当我尝试调用 set/get 方法时,它会抛出以下错误:
>>> import rangerr as r
>>> r.rangerr.min
<attribute 'min' of 'rangerr' objects>
>>> r.rangerr.min=2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'rangerr'
>>> type(r.rangerr.min)
<type 'getset_descriptor'>
我需要添加类似“PyMemberDef”的内容吗?感谢您的任何指示或帮助。
最佳答案
不可能直接为参数设置默认值。您可以向模块添加一个函数,将全局默认值设置为静态变量。
如果您只想初始化实例,则应该定义 PyTypeObject.tp_init
喜欢
static int py_rangerr_init(struct py_rangerr *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = {"min", "max", NULL};
int min = 0, max = 1;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &min, &max))
return -1;
self->range.min = min;
self->range.max = max;
return 0;
}
static PyTypeObject py_rangerr_type = {
PyObject_HEAD_INIT(NULL)
[...]
.tp_init = (initproc) py_rangerr_init,
};
如果您没有为 min
提供值或max
,行 int min = 0, max = 1;
中的默认值将被使用。
关于您关于 PyMemberDef
的使用的问题,对于像 int
这样的类型使用 PyTypeObject.tp_members
可能会减少重复性且不易出错而不是PyTypeObject.tp_getset
.
此外setter的typedef是:
typedef int (*setter)(PyObject *, PyObject *, void *);
关于python - 添加新的 python 类型 : TypeError: can't set attributes of built-in/extension type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30985786/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!