Skip to content

Conversation

@anentropic
Copy link
Contributor

@anentropic anentropic commented Nov 2, 2017

I'm making an attempt to address python/mypy#4184

from enum import Enum

# Error: Too many arguments for Enum()
PictureSize = Enum('PictureSize', 'P0 P1 P2 P3 P4 P5 P6 P7 P8', type=str, module=__name__)

to really support the type arg fully I think needs python/typing#213 ... then with the overloads decorator (since arg is optional) we could express that the return type is a subclass i.e. -> Type[Intersection[_T, _T2]]

but at the moment it's just kind of annotated and ignored


class Enum(metaclass=EnumMeta):
def __new__(cls: Type[_T], value: Any) -> _T: ...
def __new__(cls: Type[_T], value: str, names: Optional[str], module: Optional[str], qualname: Optional[str], type: Optional[Type[_T2]], start: Optional[int]) -> _T: ...
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is right—this method is for constructing enum instances, not enum classes. If anything, your change should be on EnumMeta.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So maybe we can't actually do much to fix this in typeshed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I must admit I find the Enum class rather baffling, I will look more into it

@anentropic
Copy link
Contributor Author

anentropic commented Nov 5, 2017

@JelleZijlstra

Looking into the Python source code for Enum I could see that these args actually belong on EnumMeta.__call__

I have added them there, however if I run mypy on my problem enum example with this modified typeshed I get:

.../typeshed/stdlib/3.4/enum.pyi:16: error: Signature of "__call__" incompatible with supertype "type"

but the signature of class type in typeshed builtins.py is

def __call__(self, *args: Any, **kwds: Any) -> Any: ...

so it seems like the signature of __call__ is not the cause of my original problem.

I guess as you say it's not fixable in typeshed and needs some magic in mypy to understand that Enum(...) does not instantiate an Enum, due to the wacky metaclass tricks being employed here.

@JelleZijlstra
Copy link
Member

Yes, so let's close this and attempt to fix the issue in mypy instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants