Merge branch 'main' into per-interpreter-alloc · python/cpython@22758a3 (original) (raw)

`@@ -201,23 +201,13 @@ def get(self, instance, ownerclass=None):

`

201

201

` )

`

202

202

`else:

`

203

203

`if self.fget is None:

`

204

``

`-

if self.member is None: # not sure this can happen, but just in case

`

``

204

`+

look for a member by this name.

`

``

205

`+

try:

`

``

206

`+

return ownerclass.member_map[self.name]

`

``

207

`+

except KeyError:

`

205

208

`raise AttributeError(

`

206

209

`'%r has no attribute %r' % (ownerclass, self.name)

`

207

210

` )

`

208

``

`-

issue warning deprecating this behavior

`

209

``

`-

import warnings

`

210

``

`-

warnings.warn(

`

211

``

`` -

"member.member access (e.g. Color.RED.BLUE) is "

``

212

``

`-

"deprecated and will be removed in 3.14.",

`

213

``

`-

DeprecationWarning,

`

214

``

`-

stacklevel=2,

`

215

``

`-

)

`

216

``

`-

return self.member

`

217

``

`-

XXX: uncomment in 3.14 and remove warning above

`

218

``

`-

raise AttributeError(

`

219

``

`-

'%r member has no attribute %r' % (ownerclass, self.name)

`

220

``

`-

)

`

221

211

`else:

`

222

212

`return self.fget(instance)

`

223

213

``

`@@ -314,22 +304,32 @@ def set_name(self, enum_class, member_name):

`

314

304

` ):

`

315

305

`# no other instances found, record this member in member_names

`

316

306

`enum_class.member_names.append(member_name)

`

317

``

`-

get redirect in place before adding to member_map

`

318

``

`-

but check for other instances in parent classes first

`

319

``

`-

descriptor = None

`

``

307

`+

if necessary, get redirect in place and then add it to member_map

`

``

308

`+

found_descriptor = None

`

320

309

`for base in enum_class.mro[1:]:

`

321

310

`descriptor = base.dict.get(member_name)

`

322

311

`if descriptor is not None:

`

323

312

`if isinstance(descriptor, (property, DynamicClassAttribute)):

`

``

313

`+

found_descriptor = descriptor

`

324

314

`break

`

325

``

`-

redirect = property()

`

326

``

`-

redirect.member = enum_member

`

327

``

`-

redirect.set_name(enum_class, member_name)

`

328

``

`-

if descriptor:

`

329

``

`-

redirect.fget = getattr(descriptor, 'fget', None)

`

330

``

`-

redirect.fset = getattr(descriptor, 'fset', None)

`

331

``

`-

redirect.fdel = getattr(descriptor, 'fdel', None)

`

332

``

`-

setattr(enum_class, member_name, redirect)

`

``

315

`+

elif (

`

``

316

`+

hasattr(descriptor, 'fget') and

`

``

317

`+

hasattr(descriptor, 'fset') and

`

``

318

`+

hasattr(descriptor, 'fdel')

`

``

319

`+

):

`

``

320

`+

found_descriptor = descriptor

`

``

321

`+

continue

`

``

322

`+

if found_descriptor:

`

``

323

`+

redirect = property()

`

``

324

`+

redirect.member = enum_member

`

``

325

`+

redirect.set_name(enum_class, member_name)

`

``

326

`+

earlier descriptor found; copy fget, fset, fdel to this one.

`

``

327

`+

redirect.fget = found_descriptor.fget

`

``

328

`+

redirect.fset = found_descriptor.fset

`

``

329

`+

redirect.fdel = found_descriptor.fdel

`

``

330

`+

setattr(enum_class, member_name, redirect)

`

``

331

`+

else:

`

``

332

`+

setattr(enum_class, member_name, enum_member)

`

333

333

`# now add to member_map (even aliases)

`

334

334

`enum_class.member_map[member_name] = enum_member

`

335

335

`try:

`