Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Commit2ce8af3
Patch by Erik Welch.bpo-19072 (GH-8405) allows `classmethod` to wrap other descriptors, but this doesnot work when the wrapped descriptor mimics classmethod. The current PR fixesthis.In Python 3.8 and before, one could create a callable descriptor such that thisworks as expected (see Lib/test/test_decorators.py for examples):```pythonclass A: @myclassmethod def f1(cls): return cls@classmethod @myclassmethod def f2(cls): return cls```In Python 3.8 and before, `A.f2()` return `A`. Currently in Python 3.9, itreturns `type(A)`. This PR make `A.f2()` return `A` again.As ofGH-8405, classmethod calls `obj.__get__(type)` if `obj` has `__get__`.This allows one to chain `@classmethod` and `@property` together. Whenusing classmethod-like descriptors, it's the second argument to `__get__`--theowner or the type--that is important, but this argument is currently missing.Since it is None, the "owner" argument is assumed to be the type of the firstargument, which, in this case, is wrong (we want `A`, not `type(A)`).This PR updates classmethod to call `obj.__get__(type, type)` if `obj` has`__get__`.Co-authored-by: Erik Welch <erik.n.welch@gmail.com>(cherry picked from commitb83861f)
1 parent3026d13 commit2ce8af3
File tree
3 files changed
+89
-1
lines changed- Lib/test
- Misc/NEWS.d/next/Core and Builtins
- Objects
3 files changed
+89
-1
lines changedLines changed: 86 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
1 | 1 |
| |
2 | 2 |
| |
| 3 | + | |
3 | 4 |
| |
4 | 5 |
| |
5 | 6 |
| |
| |||
329 | 330 |
| |
330 | 331 |
| |
331 | 332 |
| |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
332 | 418 |
| |
333 | 419 |
| |
334 | 420 |
| |
|
Lines changed: 2 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
| 1 | + | |
| 2 | + |
Lines changed: 1 addition & 1 deletion
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
825 | 825 |
| |
826 | 826 |
| |
827 | 827 |
| |
828 |
| - | |
| 828 | + | |
829 | 829 |
| |
830 | 830 |
| |
831 | 831 |
| |
|
0 commit comments
Comments
(0)