-
-
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
stubtest: ignore setattr and delattr inherited from object #18325
base: master
Are you sure you want to change the base?
Conversation
__setattr__ and __delattr__ from object are special cased by type checkers, so defining them on an inheriting class, even with the same signature, has a different meaning.
I also took the opportunity to make the style of the conditionals introduced by #18314 match. |
I'll note additionally that I can see arguments both for and against this change. I'm curious to see what other people think. In favor is that it draws attention to the special nature of overriding |
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.
Seems like a good change to me!
Setting runtime_attr = MISSING
gets a little dicey.
I think it's fine in this case because of IGNORABLE_CLASS_DUNDERS
, but maybe we should make verify_none
simply return if runtime
is missing (probably should rename it to verify_missing
too)
Oh, interesting. I thought that would be correct because of It looks like we hit |
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.
Yup exactly!
I'll leave open for a few days in case anyone else has opinions
__setattr__
and__delattr__
from object are special cased by type checkers, so defining them on an inheriting class, even with the same signature, has a different meaning.This one is very similar to #18314.
Typeshed has this allowlist entry:
multiprocessing.(dummy|managers).Namespace.__[gs]etattr__ # Any field can be set on Namespace
I was looking into this after I noticed that
Namespace.__setattr__
didn't appear in my local stubtest results. The reason is that it's inherited from object, butobject.__setattr__
has this note in typeshed:That lead me to python/typeshed#7385, which discusses how type checkers ignore
object.__setattr__
andobject.__delattr__
as a matter of practicality. In that light, I think that stubtest should also ignore these methods when inherited from object at runtime, and flag their existence in the stubs when runtime doesn't have a custom version.This change generates these new errors in typeshed:
It would also create new errors for
multiprocessing.dummy.Namespace.__setattr__
andmultiprocessing.managers.Namespace.__setattr__
, but these are already on the allowlist.