假设我有一个像这样的 C++ 枚举:
enum class Kind {Kind1 = 1, Kind2, Kind3};
Run Code Online (Sandbox Code Playgroud)
要使用 Pybind11 将此枚举绑定到 Python 枚举中,我正在执行以下操作:
py::enum_<Kind>(py_module, "Kind")
.value("Kind1", Kind::Kind1)
.value("Kind2", Kind::Kind2)
.value("Kind3", Kind::Kind3)
.def("__len__",
[](Kind p) {
return 3;
});
Run Code Online (Sandbox Code Playgroud)
编译代码后,如果我询问枚举的长度,我将收到此错误:
>>> len(Kind)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'pybind11_type' has no len()
Run Code Online (Sandbox Code Playgroud)
我有什么想法可以解决它吗?
编辑1:我在 Visual Studio 2019 (C++17) 上使用 Pybind11 版本 2.10.1。
编辑 2:我希望具有与 Python 枚举中相同的行为:
>>> from enum import Enum
>>> class Kind(Enum):
... kind1 = …Run Code Online (Sandbox Code Playgroud) 我有一个通常接受列表的函数,但有时也需要接受函数。有几种方法可以解决这个问题,但是能够len(foo)为给定的函数做这件事会非常有用foo。
最后,我没有传入函数,而是传入了__len__定义了函数的可调用类。但这让我开始思考,因为在 python 中一切都是对象,函数可以具有属性等,只是出于好奇......
题
有没有办法给一个函数一个len?一个快速的谷歌没有提出任何东西。
我的尝试
def foo():
return True
def my_len(self):
return 5
foo.__len__ = my_len
len(foo)
Run Code Online (Sandbox Code Playgroud)