相关疑难解决方法(0)

5409
推荐指数
22
解决办法
75万
查看次数

如何支持 Pybind11 创建的 Python 枚举的 len() 方法

假设我有一个像这样的 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)

c++ enums pybind11

5
推荐指数
1
解决办法
320
查看次数

python中函数的len()

我有一个通常接受列表的函数,但有时也需要接受函数。有几种方法可以解决这个问题,但是能够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)

python function

4
推荐指数
1
解决办法
975
查看次数

标签 统计

python ×2

c++ ×1

enums ×1

function ×1

metaclass ×1

oop ×1

pybind11 ×1

python-datamodel ×1