(self, defn: ClassDef)
| 2932 | self.fail("TypeVar default must be one of the constraint types", tv) |
| 2933 | |
| 2934 | def check_enum(self, defn: ClassDef) -> None: |
| 2935 | assert defn.info.is_enum |
| 2936 | if defn.info.fullname not in ENUM_BASES and "__members__" in defn.info.names: |
| 2937 | sym = defn.info.names["__members__"] |
| 2938 | if isinstance(sym.node, Var) and sym.node.has_explicit_value: |
| 2939 | # `__members__` will always be overwritten by `Enum` and is considered |
| 2940 | # read-only, so we disallow assigning a value to it |
| 2941 | self.fail(message_registry.ENUM_MEMBERS_ATTR_WILL_BE_OVERRIDDEN, sym.node) |
| 2942 | for base in defn.info.mro[1:-1]: # we don't need self and `object` |
| 2943 | if base.is_enum and base.fullname not in ENUM_BASES: |
| 2944 | self.check_final_enum(defn, base) |
| 2945 | |
| 2946 | if self.is_stub and self.tree.fullname not in {"enum", "_typeshed"}: |
| 2947 | if not defn.info.enum_members: |
| 2948 | self.fail( |
| 2949 | f'Detected enum "{defn.info.fullname}" in a type stub with zero members. ' |
| 2950 | "There is a chance this is due to a recent change in the semantics of " |
| 2951 | "enum membership. If so, use `member = value` to mark an enum member, " |
| 2952 | "instead of `member: type`", |
| 2953 | defn, |
| 2954 | ) |
| 2955 | self.note( |
| 2956 | "See https://typing.readthedocs.io/en/latest/spec/enums.html#defining-members", |
| 2957 | defn, |
| 2958 | ) |
| 2959 | |
| 2960 | self.check_enum_bases(defn) |
| 2961 | self.check_enum_new(defn) |
| 2962 | |
| 2963 | def check_final_enum(self, defn: ClassDef, base: TypeInfo) -> None: |
| 2964 | if base.enum_members: |
no test coverage detected