Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit579e985

Browse files
gh-89828: Do not relay the __class__ attribute in GenericAlias (GH-93754)
list[int].__class__ returned type, and isinstance(list[int], type)returned True. It caused numerous problems in code that checksisinstance(x, type).(cherry picked from commitf9433ff)Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent2eff55c commit579e985

File tree

7 files changed

+18
-20
lines changed

7 files changed

+18
-20
lines changed

‎Lib/dataclasses.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def __init__(self, type):
230230
self.type=type
231231

232232
def__repr__(self):
233-
ifisinstance(self.type,type)andnotisinstance(self.type,GenericAlias):
233+
ifisinstance(self.type,type):
234234
type_name=self.type.__name__
235235
else:
236236
# typing objects, e.g. List[int]
@@ -1248,7 +1248,7 @@ def _is_dataclass_instance(obj):
12481248
defis_dataclass(obj):
12491249
"""Returns True if obj is a dataclass or an instance of a
12501250
dataclass."""
1251-
cls=objifisinstance(obj,type)andnotisinstance(obj,GenericAlias)elsetype(obj)
1251+
cls=objifisinstance(obj,type)elsetype(obj)
12521252
returnhasattr(cls,_FIELDS)
12531253

12541254

‎Lib/functools.py‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -843,12 +843,11 @@ def _is_union_type(cls):
843843
returnget_origin(cls)in {Union,types.UnionType}
844844

845845
def_is_valid_dispatch_type(cls):
846-
ifisinstance(cls,type)andnotisinstance(cls,GenericAlias):
846+
ifisinstance(cls,type):
847847
returnTrue
848848
fromtypingimportget_args
849849
return (_is_union_type(cls)and
850-
all(isinstance(arg,type)andnotisinstance(arg,GenericAlias)
851-
forarginget_args(cls)))
850+
all(isinstance(arg,type)forarginget_args(cls)))
852851

853852
defregister(cls,func=None):
854853
"""generic_func.register(cls, func) -> func

‎Lib/pydoc.py‎

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ class or function within a module or module in a package. If the
7070
importsysconfig
7171
importtime
7272
importtokenize
73-
importtypes
7473
importurllib.parse
7574
importwarnings
7675
fromcollectionsimportdeque
@@ -92,24 +91,21 @@ def pathdirs():
9291
normdirs.append(normdir)
9392
returndirs
9493

95-
def_isclass(object):
96-
returninspect.isclass(object)andnotisinstance(object,types.GenericAlias)
97-
9894
def_findclass(func):
9995
cls=sys.modules.get(func.__module__)
10096
ifclsisNone:
10197
returnNone
10298
fornameinfunc.__qualname__.split('.')[:-1]:
10399
cls=getattr(cls,name)
104-
ifnot_isclass(cls):
100+
ifnotinspect.isclass(cls):
105101
returnNone
106102
returncls
107103

108104
def_finddoc(obj):
109105
ifinspect.ismethod(obj):
110106
name=obj.__func__.__name__
111107
self=obj.__self__
112-
if (_isclass(self)and
108+
if (inspect.isclass(self)and
113109
getattr(getattr(self,name,None),'__func__')isobj.__func__):
114110
# classmethod
115111
cls=self
@@ -123,7 +119,7 @@ def _finddoc(obj):
123119
elifinspect.isbuiltin(obj):
124120
name=obj.__name__
125121
self=obj.__self__
126-
if (_isclass(self)and
122+
if (inspect.isclass(self)and
127123
self.__qualname__+'.'+name==obj.__qualname__):
128124
# classmethod
129125
cls=self
@@ -210,7 +206,7 @@ def classname(object, modname):
210206

211207
defisdata(object):
212208
"""Check if an object is of a type that probably means it's data."""
213-
returnnot (inspect.ismodule(object)or_isclass(object)or
209+
returnnot (inspect.ismodule(object)orinspect.isclass(object)or
214210
inspect.isroutine(object)orinspect.isframe(object)or
215211
inspect.istraceback(object)orinspect.iscode(object))
216212

@@ -481,7 +477,7 @@ def document(self, object, name=None, *args):
481477
# by lacking a __name__ attribute) and an instance.
482478
try:
483479
ifinspect.ismodule(object):returnself.docmodule(*args)
484-
if_isclass(object):returnself.docclass(*args)
480+
ifinspect.isclass(object):returnself.docclass(*args)
485481
ifinspect.isroutine(object):returnself.docroutine(*args)
486482
exceptAttributeError:
487483
pass
@@ -783,7 +779,7 @@ def docmodule(self, object, name=None, mod=None, *ignored):
783779
modules=inspect.getmembers(object,inspect.ismodule)
784780

785781
classes,cdict= [], {}
786-
forkey,valueininspect.getmembers(object,_isclass):
782+
forkey,valueininspect.getmembers(object,inspect.isclass):
787783
# if __all__ exists, believe it. Otherwise use old heuristic.
788784
if (allisnotNoneor
789785
(inspect.getmodule(value)orobject)isobject):
@@ -1223,7 +1219,7 @@ def docmodule(self, object, name=None, mod=None):
12231219
result=result+self.section('DESCRIPTION',desc)
12241220

12251221
classes= []
1226-
forkey,valueininspect.getmembers(object,_isclass):
1222+
forkey,valueininspect.getmembers(object,inspect.isclass):
12271223
# if __all__ exists, believe it. Otherwise use old heuristic.
12281224
if (allisnotNone
12291225
or (inspect.getmodule(value)orobject)isobject):
@@ -1707,7 +1703,7 @@ def describe(thing):
17071703
return'member descriptor %s.%s.%s'% (
17081704
thing.__objclass__.__module__,thing.__objclass__.__name__,
17091705
thing.__name__)
1710-
if_isclass(thing):
1706+
ifinspect.isclass(thing):
17111707
return'class '+thing.__name__
17121708
ifinspect.isfunction(thing):
17131709
return'function '+thing.__name__
@@ -1768,7 +1764,7 @@ def render_doc(thing, title='Python Library Documentation: %s', forceload=0,
17681764
desc+=' in module '+module.__name__
17691765

17701766
ifnot (inspect.ismodule(object)or
1771-
_isclass(object)or
1767+
inspect.isclass(object)or
17721768
inspect.isroutine(object)or
17731769
inspect.isdatadescriptor(object)or
17741770
_getdoc(object)):

‎Lib/types.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def resolve_bases(bases):
8080
updated=False
8181
shift=0
8282
fori,baseinenumerate(bases):
83-
ifisinstance(base,type)andnotisinstance(base,GenericAlias):
83+
ifisinstance(base,type):
8484
continue
8585
ifnothasattr(base,"__mro_entries__"):
8686
continue

‎Lib/typing.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ def __typing_prepare_subst__(self, alias, args):
10791079
var_tuple_index=None
10801080
fillarg=None
10811081
fork,arginenumerate(args):
1082-
ifnot(isinstance(arg,type)andnotisinstance(arg,GenericAlias)):
1082+
ifnotisinstance(arg,type):
10831083
subargs=getattr(arg,'__typing_unpacked_tuple_args__',None)
10841084
ifsubargsandlen(subargs)==2andsubargs[-1]is ...:
10851085
ifvar_tuple_indexisnotNone:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:class:`types.GenericAlias` no longer relays the ``__class__`` attribute.
2+
For example, ``isinstance(list[int], type)`` no longer returns ``True``.

‎Objects/genericaliasobject.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,7 @@ ga_vectorcall(PyObject *self, PyObject *const *args,
583583
}
584584

585585
staticconstchar*constattr_exceptions[]= {
586+
"__class__",
586587
"__origin__",
587588
"__args__",
588589
"__unpacked__",

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp