我正在try 为Python3.11中的新的@enum.nonmemberdecorator 设计一个用例.文件明确提到,这是一种旨在应用于成员的装饰品. 然而,当我试着直接装饰一名成员时:

import enum


class MyClass(enum.Enum):
    A = 1
    B = 2

    @enum.nonmember
    C = 3

这会导致错误,如:

Traceback (most recent call last):
  File "C:\Program Files\Python311\Lib\code.py", line 63, in runsource
    code = self.compile(source, filename, symbol)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\codeop.py", line 153, in __call__
    return _maybe_compile(self.compiler, source, filename, symbol)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\codeop.py", line 73, in _maybe_compile
    return compiler(source, filename, symbol)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\codeop.py", line 118, in __call__
    codeob = compile(source, filename, symbol, self.flags, True)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<input>", line 9
    C = 3
    ^
SyntaxError: invalid syntax

然而,如果我将属性声明为属性或描述符,它也不会成为Enum成员……那么,你是如何、何时、为什么使用@enum.nonmember的呢?

推荐答案

您可以这样使用它:

import enum


class MyClass(enum.Enum):
    A = 1
    B = 2

    C = enum.nonmember(3)

就我所知,它被称为修饰器的唯一原因是因为嵌套的类.

目前,

class MyClass(enum.Enum):
    A = 1
    B = 2

    class MyNestedClass:
        pass

使MyClass.MyNestedClass成为MyClass的成员之一.这种情况将在3.13中发生变化.因此,如果您现在想要新的行为,您可以使用:

class MyClass(enum.Enum):
    A = 1
    B = 2

    @enum.nonmember
    class MyNestedClass:
        pass

在3.13中,如果您想要使嵌套类成为成员的当前行为,您可以使用

class MyClass(enum.Enum):
    A = 1
    B = 2

    @enum.member
    class MyNestedClass:
        pass

没有理由使用enum.nonmember作为方法的修饰符,因为方法已经被排除在成员之外,但我认为如果您愿意,可以使用enum.member来定义方法成员.不过,我不知道你为什么会这么做.

Python相关问答推荐

双情节在单个图上切换-pPython

Pandas基于另一列的价值的新列

修剪Python框架中的尾随NaN值

从收件箱获取特定列中的重复行

如何将 map 数组组合到pyspark中每列的单个 map 中

如何判断. text文件中的某个字符,然后读取该行

脚注在Python中使用regex导致错误匹配

使用Curses for Python保存和恢复终端窗口内容

将词典写入Excel

使用Python Great Expectations和python-oracledb

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

为什么dict(id=1,**{id:2})有时会引发KeyMessage:id而不是TypMessage?

请从Python访问kivy子部件的功能需要帮助

Python无法在已导入的目录中看到新模块

具有多个选项的计数_匹配

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

在Python中处理大量CSV文件中的数据

C#使用程序从Python中执行Exec文件

如何在FastAPI中为我上传的json文件提供索引ID?

Python全局变量递归得到不同的结果