Uh oh!
There was an error while loading. Please reload this page.
Implementation of PEP 673 (typing.Self) - #11666
Conversation
JelleZijlstra
commented
Dec 5, 2021
Did you do this off an old checkout? There's a ton of merge conflicts. The PEP itself suggested implementing Self by desugaring into a bound TypeVar, which might be easier since it can (hopefully) be done fully in the semanal phase. |
Gobot1234
commented
Dec 5, 2021
|
This comment has been minimized.
This comment has been minimized.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
MathiasSven
commented
Dec 18, 2021
I am not completely sure it is due to the implementation, but in the piece of code bellow mypy cannot correctly understand the type of an object that uses this commit's implementation of fromtypingimportGeneric, TypeVar, Any, Optional, Protocol, Callablefromtyping_extensionsimportSelffromabcimportABCT=TypeVar("T")
K=TypeVar("K")
classClassProperty(Protocol[T, K]):
def__init__(self, getter: Callable[[T], K]) ->None: ...
def__get__(self, obj: None, type: type[T] |None= ...) ->K: ...
defclassproperty(f: Callable[[T], K]) ->ClassProperty[T, K]: ...
classItemSet(Generic[T]):
deffirst(self) ->T: ...
classBaseItem(ABC):
@classpropertydefset(cls) ->ItemSet[Self]: ...
classFooItem(BaseItem):
name: strdeftest(self) ->None: ...
reveal_type(FooItem.set)
reveal_type(FooItem.set.first().test())
t.py:8: error: Invarianttypevariable"T"usedinprotocolwherecontravariantoneisexpected [misc]
t.py:8: error: Invarianttypevariable"K"usedinprotocolwherecovariantoneisexpected [misc]
t.py:25: note: Revealedtypeis"t.ItemSet*[Self@t.BaseItem]"t.py:26: error: "object"hasnoattribute"test" [attr-defined]
t.py:26: note: Revealedtypeis"Any"
t.py:25:13-info: Typeof"FooItem.set"is"ItemSet[FooItem]"t.py:26:13-info: Typeof"FooItem.set.first().test()"is"None"The contravariant and covariant issue is separate and I believe it is a problem with master too, by following the prompt it just leads to pyright complaining that T and K should be invariant and then for both it leads to "Cannot use a contravariant type variable as return type", so I assume they should be invariant. |
# Conflicts: # mypy/constraints.py # mypy/semanal.py # mypy/subtypes.py # mypy/typeanal.py
This comment has been minimized.
This comment has been minimized.
Gobot1234
commented
Jan 16, 2022
I'd like a bit of advice on how to be substitute Self into a function signature, should I use a TypeVistor subclass or should I just have a function to do it? |
| if sys.version_info >= (3, 11): | ||
| # Self is also a (non-subscriptable) special form. | ||
| Self: object = ... |
There was a problem hiding this comment.
We shouldn't change this directly, it is just copied from typeshed
Uh oh!
There was an error while loading. Please reload this page.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
I'm not sure, but it seems that the documentation says nothing about
That's also weird because the documentation doesn't promise that either: "The return value of Perhaps things have changed since the docs were written, but it seems that all you can promise a priori is: @staticmethoddef__new__(cls: type, ...) ->AnyIt's not even guaranteed that the return value has the same type. I think MyPy should automatically apply this basic assumption, and if the user wants to add additional guarantees, they should be free to do so, e.g., |
For what it's worth, pyright seems to allow EDIT: but not in static methods: |
Gobot1234
commented
Jun 21, 2022
Hi @erikkemperman now that my exams are over would you be ok with me co-authoring you on this as I try to push it over the finish line? |
erikkemperman
commented
Jun 22, 2022
@Gobot1234 That’d be wonderful, actually — I got a bit stuck to be honest, and have been too busy with work stuff to work on this. For what it’s worth, here is my branch: https://github.com/erikkemperman/mypy/commits/gobot-master This is basically your PR, merged with the upstream master branch of end of May, plus some some small fixes to make some tests pass. At that point I had the feeling that it should be possible to implement this PEP in a somewhat “smaller” approach, i.e. the desugaring strategy you also mentioned, but I did not get very far trying that for lack of time. I also was slightly confused about some edge cases like I still think it’s a bit odd that mypy handles this method differently if a user explicitly decorates it as static, but that should probably be a separate issue. |
# Conflicts: # mypy/meet.py # mypy/typeops.py
This comment has been minimized.
This comment has been minimized.
NeilGirdhar
commented
Jun 22, 2022
Looks like the interaction with class methods is messed up. When |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
steam.py
I'm able to fix these locally I can push these changes at some point later in the week. ✅ fixed
These are concerning but I'm not entirely what's causing them,
First error is catching a valid type error not sure what the second is on about
Is a type error on my end.
This error is a genieuly baffling one I'm yet to wrap my head round. These functions (
It seems like this case needs a bit of special casing for the compatiblity checker. discord.py
Something very funky is going on here considering (for or) they are test.py:212: error: Signaturesof"__ior__"and"__or__"areincompatibletest.py:215: note: Revealedtypeis"def (__main__.Flags, Self@__main__.Flags) -> Self@__main__.Flags"test.py:216: note: Revealedtypeis"def (__main__.Flags, Self@__main__.Flags) -> Self@__main__.Flags"
Something here isn't being bound correctly. ✅ fixed |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Gobot1234
commented
Jul 5, 2022
For the classTradeOffer:
@classmethoddef_from_history(cls) ->Self:
trade=cls()
returntradeclassAsyncIterator(Generic[T]):
_fill: AsyncGeneratorType[T, None]
def__aiter__(self) ->Self:
returnselfdef__anext__(self) ->Coroutine[None, None, T]:
returnself._fill.__anext__()
asyncdefnext(self) ->T:
returnawaitself.__anext__()
asyncdeffill(self) ->AsyncGenerator[T, None]:
raiseNotImplementedErroryieldclassTradesIterator(AsyncIterator["TradeOffer"]):
asyncdeffill(self) ->AsyncGenerator[TradeOffer, None]:
asyncdefget_trades(page: int=100) ->list[TradeOffer]:
trades: list[TradeOffer] = []
fortradein ():
trades.append(TradeOffer._from_history())
returntradesfortradeinawaitget_trades():
yieldtradeworks. I also haven't been able to reproduce the tornado errors with a small snippet importunittestclassAsyncTestCase(unittest.TestCase):
...
classAsyncHTTPTestCase(AsyncTestCase):
...
classWebSocketBaseTestCase(AsyncHTTPTestCase):
@types.coroutinedeffoo(self, path: str, **kwargs: Any):
yield@overloaddefgen_test(
*, timeout: Union[float, None] =None
) ->Callable[[Callable[..., Union[Generator, "Coroutine"]]], Callable[..., None]]:
pass@overload# noqa: F811defgen_test(func: Callable[..., Union[Generator, "Coroutine"]]) ->Callable[..., None]:
passdefgen_test( # noqa: F811func=None,
timeout=None,
):
passclassWSTest(WebSocketBaseTestCase):
@gen_testdefbar(self: Any):
yieldreveal_type(self.assertEqual()) # revealed type is Any |
Diff from mypy_primer, showing the effect of this PR on open source code: steam.py (https://github.com/Gobot1234/steam.py)
+ steam/enums.py:99: error: Incompatible return value type (got "Type[Enum]", expected "object") [return-value]- steam/enums.py:79: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:79: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:148: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:148: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:177: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:177: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:179: error: "Type[Self?]" has no attribute "_value_map_" [attr-defined]- steam/enums.py:181: error: No overload variant of "__new__" of "type" matches argument types "Type[Self?]", "str", "Any" [call-overload]- steam/enums.py:181: note: Possible overload variants:- steam/enums.py:181: note: def __new__(cls, cls: Type[type], object) -> type- steam/enums.py:181: note: def [Self] __new__(cls, cls: Type[Self], str, Tuple[type, ...], Dict[str, Any], **kwds: Any) -> Self- steam/enums.py:199: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:199: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:212: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:212: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:216: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:216: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:503: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:503: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/enums.py:910: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/enums.py:910: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/utils.py:438: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/utils.py:438: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/utils.py:445: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/utils.py:445: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/utils.py:457: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/utils.py:457: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/utils.py:464: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/utils.py:464: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/utils.py:582: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/utils.py:582: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/utils.py:586: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/utils.py:586: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/protobufs/struct_messages.py:15: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/protobufs/struct_messages.py:15: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/protobufs/struct_messages.py:32: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/protobufs/struct_messages.py:32: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/protobufs/struct_messages.py:57: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/protobufs/struct_messages.py:57: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/protobufs/struct_messages.py:70: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/protobufs/struct_messages.py:70: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/role.py:94: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/role.py:94: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/iterators.py:174: error: Self? has no attribute "__anext__" [attr-defined]- steam/iterators.py:189: error: Self? has no attribute "__anext__" [attr-defined]- steam/iterators.py:225: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/iterators.py:225: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases+ steam/iterators.py:374: error: Argument 1 to "append" of "list" has incompatible type "Type[TradeOffer]"; expected "TradeOffer" [arg-type]- steam/iterators.py:624: error: Self? has no attribute "created_at" [attr-defined]- steam/iterators.py:632: error: Self? has no attribute "created_at" [attr-defined]- steam/models.py:62: error: "__new__" must return a class instance (got Self?) [misc]- steam/models.py:62: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/models.py:62: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/gateway.py:284: error: Self? has no attribute "__anext__" [attr-defined]- steam/trade.py:568: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/trade.py:568: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/trade.py:577: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/trade.py:577: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/package.py:147: error: Unsupported left operand type for & (Self?) [operator]- steam/abc.py:272: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/abc.py:272: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/abc.py:293: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/abc.py:293: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/abc.py:316: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/abc.py:316: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/abc.py:985: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/abc.py:985: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/abc.py:1012: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/abc.py:1012: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:148: error: "__new__" must return a class instance (got Self?) [misc]- steam/manifest.py:148: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:148: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:151: error: Self? has no attribute "_mapping" [attr-defined]- steam/manifest.py:152: error: Self? has no attribute "_manifest" [attr-defined]- steam/manifest.py:165: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:165: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:171: error: Self? has no attribute "_manifest" [attr-defined]- steam/manifest.py:174: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:174: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:178: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:178: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:222: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:222: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:236: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:236: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:242: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:242: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/manifest.py:250: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/manifest.py:250: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/chat.py:276: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/chat.py:276: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/chat.py:321: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/chat.py:321: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/review.py:177: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/review.py:177: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/review.py:206: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/review.py:206: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases+ steam/clan.py:249: error: Incompatible types in assignment (expression has type "Union[User, SteamID]", variable has type "Optional[User]") [assignment]+ steam/clan.py:249: error: Incompatible types in assignment (expression has type "List[Union[User, SteamID]]", variable has type "List[Optional[User]]") [assignment]- steam/clan.py:241: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/clan.py:241: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/clan.py:244: error: Self? has no attribute "_id" [attr-defined]- steam/clan.py:245: error: Self? has no attribute "tagline" [attr-defined]- steam/clan.py:246: error: Self? has no attribute "active_member_count" [attr-defined]- steam/clan.py:247: error: Self? has no attribute "game" [attr-defined]- steam/clan.py:247: error: Self? has no attribute "_state" [attr-defined]- steam/clan.py:249: error: Self? has no attribute "owner" [attr-defined]- steam/clan.py:249: error: Self? has no attribute "top_members" [attr-defined]- steam/clan.py:249: error: Self? has no attribute "_state" [attr-defined]- steam/clan.py:253: error: Self? has no attribute "_populate_roles" [attr-defined]- steam/clan.py:254: error: Self? has no attribute "_default_role_id" [attr-defined]+ steam/clan.py:343: error: Incompatible return value type (got "Clan", expected "Event[EventType]") [return-value]+ steam/clan.py:355: error: Incompatible return value type (got "Clan", expected "Announcement") [return-value]+ steam/group.py:59: error: Return type "Coroutine[Any, Any, Group]" of "_from_proto" incompatible with return type "Coroutine[Any, Any, Clan]" in supertype "ChatGroup" [override]- steam/state.py:106: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/state.py:106: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases+ steam/state.py:314: error: Incompatible types in assignment (expression has type "Type[TradeOffer]", variable has type "TradeOffer") [assignment]- steam/state.py:950: error: Self? has no attribute "id" [attr-defined]- steam/state.py:951: error: Self? has no attribute "_id" [attr-defined]- steam/state.py:952: error: Self? has no attribute "_id" [attr-defined]- steam/state.py:988: error: Self? has no attribute "_update_channels" [attr-defined]- steam/state.py:992: error: Self? has no attribute "id" [attr-defined]- steam/state.py:993: error: Self? has no attribute "_id" [attr-defined]- steam/state.py:994: error: Self? has no attribute "_id" [attr-defined]- steam/state.py:1245: error: Self? has no attribute "__anext__" [attr-defined]- steam/ext/commands/cooldown.py:60: error: Item "Channel[Self?]" of "Union[Channel[Self?], Any, SteamID]" has no attribute "id" [union-attr]+ steam/ext/commands/cooldown.py:60: error: Item "Channel[object]" of "Union[Channel[object], Any, SteamID]" has no attribute "id" [union-attr]- steam/ext/commands/commands.py:234: error: Self? has no attribute "name" [attr-defined]- steam/ext/commands/commands.py:237: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/ext/commands/commands.py:237: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases+ steam/ext/commands/commands.py:841: error: Incompatible return value type (got "List[Command[Any]]", expected "List[Group[Any]]") [return-value]- steam/ext/commands/commands.py:828: error: Variable "typing_extensions.Self" is not valid as a type [valid-type]- steam/ext/commands/commands.py:828: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- steam/ext/commands/cog.py:88: error: Self? has no attribute "__original_kwargs__" [attr-defined]+ steam/ext/commands/cog.py:88: error: "Group[Any]" has no attribute "__original_kwargs__" [attr-defined]- steam/ext/commands/cog.py:200: error: Self? has no attribute "clean_params" [attr-defined]- steam/ext/commands/cog.py:201: error: Self? has no attribute "cog" [attr-defined]- steam/ext/commands/cog.py:202: error: Self? has no attribute "clean_params" [attr-defined]- steam/ext/commands/help.py:184: error: Self? has no attribute "name" [attr-defined]
discord.py (https://github.com/Rapptz/discord.py)
+ discord/ui/view.py:218: error: INTERNAL ERROR -- Please try using mypy master on GitHub:+ https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build+ Please report a bug at https://github.com/python/mypy/issues+ version: 0.970+dev.7f6e2fbb03b392e39472c86893b143dd71e171b7+ discord/ui/view.py:218: : note: use --pdb to drop into pdb- discord/enums.py:100: error: Variable "typing_extensions.Self" is not valid as a type- discord/enums.py:100: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases+ discord/flags.py:131: error: Signatures of "__ior__" and "__or__" are incompatible+ discord/flags.py:135: error: Signatures of "__iand__" and "__and__" are incompatible+ discord/flags.py:139: error: Signatures of "__ixor__" and "__xor__" are incompatible- discord/flags.py:56: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:56: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:122: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:122: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:123: error: Self? has no attribute "value"- discord/flags.py:125: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:125: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:126: error: Self? has no attribute "value"- discord/flags.py:128: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:128: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:129: error: Self? has no attribute "value"- discord/flags.py:131: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:131: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:132: error: Self? has no attribute "value"- discord/flags.py:135: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:135: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:136: error: Self? has no attribute "value"- discord/flags.py:139: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:139: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:140: error: Self? has no attribute "value"- discord/flags.py:143: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:143: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:1487: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:1487: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:1488: error: No overload variant of "__new__" of "type" matches argument type "Type[Self?]"- discord/flags.py:1488: note: Possible overload variants:- discord/flags.py:1488: note: def __new__(cls, cls: Type[type], object) -> type- discord/flags.py:1488: note: def [Self] __new__(cls, cls: Type[Self], str, Tuple[type, ...], Dict[str, Any], **kwds: Any) -> Self- discord/flags.py:1572: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:1572: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:1574: error: "Type[Self?]" has no attribute "VALID_FLAGS"- discord/flags.py:1576: error: No overload variant of "__new__" of "type" matches argument type "Type[Self?]"- discord/flags.py:1576: note: Possible overload variants:- discord/flags.py:1576: note: def __new__(cls, cls: Type[type], object) -> type- discord/flags.py:1576: note: def [Self] __new__(cls, cls: Type[Self], str, Tuple[type, ...], Dict[str, Any], **kwds: Any) -> Self- discord/flags.py:1581: error: Variable "typing_extensions.Self" is not valid as a type- discord/flags.py:1581: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/flags.py:1583: error: No overload variant of "__new__" of "type" matches argument type "Type[Self?]"- discord/flags.py:1583: note: Possible overload variants:- discord/flags.py:1583: note: def __new__(cls, cls: Type[type], object) -> type- discord/flags.py:1583: note: def [Self] __new__(cls, cls: Type[Self], str, Tuple[type, ...], Dict[str, Any], **kwds: Any) -> Self- discord/permissions.py:170: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:170: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:176: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:176: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:185: error: Self? has no attribute "view_channel"- discord/permissions.py:186: error: Self? has no attribute "read_message_history"- discord/permissions.py:187: error: Self? has no attribute "value"- discord/permissions.py:190: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:190: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:192: error: Self? has no attribute "read_messages"- discord/permissions.py:193: error: Self? has no attribute "send_tts_messages"- discord/permissions.py:194: error: Self? has no attribute "manage_messages"- discord/permissions.py:198: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:198: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:224: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:224: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:237: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:237: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:246: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:246: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:261: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:261: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:267: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:267: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:276: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:276: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:292: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:292: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:313: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:313: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/permissions.py:794: error: Variable "typing_extensions.Self" is not valid as a type- discord/permissions.py:794: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:162: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:162: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:167: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:167: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:173: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:173: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:211: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:211: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:216: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:216: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:237: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:237: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:242: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:242: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:247: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:247: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:255: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:255: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:260: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:260: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:265: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:265: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:270: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:270: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:275: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:275: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:280: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:280: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:285: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:285: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:290: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:290: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:295: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:295: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:300: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:300: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:305: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:305: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:310: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:310: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:315: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:315: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:323: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:323: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:328: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:328: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:333: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:333: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:340: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:340: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:347: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:347: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:354: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:354: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:361: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:361: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:366: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:366: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:371: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:371: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:376: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:376: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:385: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:385: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/colour.py:393: error: Variable "typing_extensions.Self" is not valid as a type- discord/colour.py:393: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/mentions.py:101: error: Variable "typing_extensions.Self" is not valid as a type- discord/mentions.py:101: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases- discord/mentions.py:109: error: Variable "typing_extensions.Self" is not valid as a typ
... (truncated 33546 lines) ... |
Ref #12840Fixes#11871Fixes#14089 This is an alternative implementation to two existing PRs: #11666, #13133. This PR treats `typing.Self` as pure syntactic sugar, and transforms it into a type variable early during semantic analyzis. This way we can re-use all the existing machinery and handled edge cases for self-types. The only new thing is self-type for _attributes_ (as proposed in the PEP). This required handling in several places, since attribute access is duplicated in several places (see #7724), plus special forms (like NamedTuples and TypedDicts) and dataclasses plugin require additional care, since they use attribute annotations in special ways. I don't copy all the existing tests for "old style" self-types, but only some common use cases, possible error conditions, and relevant new edge cases, such as e.g. special forms mentioned above, and implicit type variable binding for callable types.
ilevkivskyi
commented
Nov 15, 2022
Superseded by #14041 |
Description
An initial implementation of typing.Self type checking for PEP 673.
Couple of questions:
Test Plan
I've tested the use cases from the PEP individually and it worked but unit test wise I'm not entirely sure what to do should I basically just copy all of https://github.com/python/mypy/blob/master/test-data/unit/check-selftype.test and add some extra stuff for recursive classes and staticmethods?