-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implementation of PEP 673 (typing.Self) #11666
Conversation
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. |
|
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Awesome, very excited for this feature! 👍
Going to leave some minor early comments 🙂
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.
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 from typing import Generic, TypeVar, Any, Optional, Protocol, Callable
from typing_extensions import Self
from abc import ABC
T = TypeVar("T")
K = TypeVar("K")
class ClassProperty(Protocol[T, K]):
def __init__(self, getter: Callable[[T], K]) -> None: ...
def __get__(self, obj: None, type: type[T] | None = ...) -> K: ...
def classproperty(f: Callable[[T], K]) -> ClassProperty[T, K]: ...
class ItemSet(Generic[T]):
def first(self) -> T: ...
class BaseItem(ABC):
@classproperty
def set(cls) -> ItemSet[Self]: ...
class FooItem(BaseItem):
name: str
def test(self) -> None: ...
reveal_type(FooItem.set)
reveal_type(FooItem.set.first().test())
t.py:8: error: Invariant type variable "T" used in protocol where contravariant one is expected [misc]
t.py:8: error: Invariant type variable "K" used in protocol where covariant one is expected [misc]
t.py:25: note: Revealed type is "t.ItemSet*[Self@t.BaseItem]"
t.py:26: error: "object" has no attribute "test" [attr-defined]
t.py:26: note: Revealed type is "Any"
t.py:25:13 - info: Type of "FooItem.set" is "ItemSet[FooItem]"
t.py:26:13 - info: Type of "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.
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? |
mypy/typeshed/stdlib/typing.pyi
Outdated
@@ -84,6 +84,10 @@ if sys.version_info >= (3, 10): | |||
TypeAlias: _SpecialForm = ... | |||
TypeGuard: _SpecialForm = ... | |||
|
|||
if sys.version_info >= (3, 11): | |||
# Self is also a (non-subscriptable) special form. | |||
Self: object = ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We shouldn't change this directly, it is just copied from typeshed
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: @staticmethod
def __new__(cls: type, ...) -> Any It'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: |
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? |
@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. |
Gobot master
# Conflicts: # mypy/meet.py # mypy/typeops.py
This comment has been minimized.
This comment has been minimized.
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: Signatures of "__ior__" and "__or__" are incompatible
test.py:215: note: Revealed type is "def (__main__.Flags, Self@__main__.Flags) -> Self@__main__.Flags"
test.py:216: note: Revealed type is "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.
For the class TradeOffer:
@classmethod
def _from_history(cls) -> Self:
trade = cls()
return trade
class AsyncIterator(Generic[T]):
_fill: AsyncGeneratorType[T, None]
def __aiter__(self) -> Self:
return self
def __anext__(self) -> Coroutine[None, None, T]:
return self._fill.__anext__()
async def next(self) -> T:
return await self.__anext__()
async def fill(self) -> AsyncGenerator[T, None]:
raise NotImplementedError
yield
class TradesIterator(AsyncIterator["TradeOffer"]):
async def fill(self) -> AsyncGenerator[TradeOffer, None]:
async def get_trades(page: int = 100) -> list[TradeOffer]:
trades: list[TradeOffer] = []
for trade in ():
trades.append(TradeOffer._from_history())
return trades
for trade in await get_trades():
yield trade works. I also haven't been able to reproduce the tornado errors with a small snippet import unittest
class AsyncTestCase(unittest.TestCase):
...
class AsyncHTTPTestCase(AsyncTestCase):
...
class WebSocketBaseTestCase(AsyncHTTPTestCase):
@types.coroutine
def foo(self, path: str, **kwargs: Any):
yield
@overload
def gen_test(
*, timeout: Union[float, None] = None
) -> Callable[[Callable[..., Union[Generator, "Coroutine"]]], Callable[..., None]]:
pass
@overload # noqa: F811
def gen_test(func: Callable[..., Union[Generator, "Coroutine"]]) -> Callable[..., None]:
pass
def gen_test( # noqa: F811
func = None,
timeout=None,
):
pass
class WSTest(WebSocketBaseTestCase):
@gen_test
def bar(self: Any):
yield reveal_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 #12840 Fixes #11871 Fixes #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.
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?