Bug report
Bug description:
The comment here
| /* pto->kw is mutable, so need to check every time */ |
Indicates that it needs to be checked every time. However, once it removes vectorcall in partial_vectorcall_fallback there is no mechanism to set it back.
def func(a, b, c=0): return a - b - c p2 = partial(func, 1, c=1) In [13]: print(p2(2)) # -1 vectorcall call -2 In [14]: In [14]: print(p2(2)) # -1 call -2 In [15]: del p2.keywords['c'] In [16]: print(p2(2)) # -1 call -1
I see 3 possibilities:
- Set additional flag in
partial_setvectorcall(pto->hasvcall) storing state whethervectorcallis supported. Then implement fallback inpartial_callin the same manner as it looks now inpartial_vectorcall - Re-setting vectorcall after
_PyObject_MakeTpCallinpartial_vectorcall_fallback. So thatpartial_vectorcallwill stay as a primary entry in all cases. This adds 4ns overhead compared to 1. - Leave it as it is, but remove confusion that this needs to be checked more than 1 time.
CPython versions tested on:
3.11
Operating systems tested on:
macOS