@@ -285,10 +285,7 @@ def __new__(*args, **keywords):
285285
286286 if hasattr (func , "func" ):
287287 args = func .args + args
288- tmpkw = func .keywords .copy ()
289- tmpkw .update (keywords )
290- keywords = tmpkw
291- del tmpkw
288+ keywords = {** func .keywords , ** keywords }
292289 func = func .func
293290
294291 self = super (partial , cls ).__new__ (cls )
@@ -302,9 +299,8 @@ def __call__(*args, **keywords):
302299 if not args :
303300 raise TypeError ("descriptor '__call__' of partial needs an argument" )
304301 self , * args = args
305- newkeywords = self .keywords .copy ()
306- newkeywords .update (keywords )
307- return self .func (* self .args , * args , ** newkeywords )
302+ keywords = {** self .keywords , ** keywords }
303+ return self .func (* self .args , * args , ** keywords )
308304
309305 @recursive_repr ()
310306 def __repr__ (self ):
@@ -371,8 +367,7 @@ def __init__(self, func, *args, **keywords):
371367 # it's also more efficient since only one function will be called
372368 self .func = func .func
373369 self .args = func .args + args
374- self .keywords = func .keywords .copy ()
375- self .keywords .update (keywords )
370+ self .keywords = {** func .keywords , ** keywords }
376371 else :
377372 self .func = func
378373 self .args = args
@@ -391,11 +386,9 @@ def __repr__(self):
391386
392387 def _make_unbound_method (self ):
393388 def _method (* args , ** keywords ):
394- call_keywords = self .keywords .copy ()
395- call_keywords .update (keywords )
396- cls_or_self , * rest = args
397- call_args = (cls_or_self ,) + self .args + tuple (rest )
398- return self .func (* call_args , ** call_keywords )
389+ cls_or_self , * args = args
390+ keywords = {** self .keywords , ** keywords }
391+ return self .func (cls_or_self , * self .args , * args , ** keywords )
399392 _method .__isabstractmethod__ = self .__isabstractmethod__
400393 _method ._partialmethod = self
401394 return _method
0 commit comments