@@ -319,7 +319,8 @@ def __init__(self, func_def, code_list, code_str, global_ctx):
319
319
self .local_names = None
320
320
self .local_sym_table = {}
321
321
self .doc_string = ast .get_docstring (func_def )
322
- self .num_posn_arg = len (self .func_def .args .args ) - len (self .defaults )
322
+ self .num_posonly_arg = len (self .func_def .args .posonlyargs )
323
+ self .num_posn_arg = self .num_posonly_arg + len (self .func_def .args .args ) - len (self .defaults )
323
324
self .code_list = code_list
324
325
self .code_str = code_str
325
326
self .exception = None
@@ -342,7 +343,7 @@ async def eval_defaults(self, ast_ctx):
342
343
self .defaults = []
343
344
for val in self .func_def .args .defaults :
344
345
self .defaults .append (await ast_ctx .aeval (val ))
345
- self .num_posn_arg = len (self .func_def .args .args ) - len (self .defaults )
346
+ self .num_posn_arg = self . num_posonly_arg + len (self .func_def .args .args ) - len (self .defaults )
346
347
self .kw_defaults = []
347
348
for val in self .func_def .args .kw_defaults :
348
349
self .kw_defaults .append ({"ok" : bool (val ), "val" : None if not val else await ast_ctx .aeval (val )})
@@ -669,7 +670,7 @@ def get_doc_string(self):
669
670
def get_positional_args (self ):
670
671
"""Return the function positional arguments."""
671
672
args = []
672
- for arg in self .func_def .args .args :
673
+ for arg in self .func_def .args .posonlyargs + self . func_def . args . args :
673
674
args .append (arg .arg )
674
675
return args
675
676
@@ -689,14 +690,17 @@ async def call(self, ast_ctx, *args, **kwargs):
689
690
if args is None :
690
691
args = []
691
692
kwargs = kwargs .copy () if kwargs else {}
692
- for i , func_def_arg in enumerate (self .func_def .args .args ):
693
+ bad_kwargs = []
694
+ for i , func_def_arg in enumerate (self .func_def .args .posonlyargs + self .func_def .args .args ):
693
695
var_name = func_def_arg .arg
694
696
val = None
695
697
if i < len (args ):
696
698
val = args [i ]
697
699
if var_name in kwargs :
698
700
raise TypeError (f"{ self .name } () got multiple values for argument '{ var_name } '" )
699
701
elif var_name in kwargs :
702
+ if i < self .num_posonly_arg :
703
+ bad_kwargs .append (var_name )
700
704
val = kwargs [var_name ]
701
705
del kwargs [var_name ]
702
706
elif self .num_posn_arg <= i < len (self .defaults ) + self .num_posn_arg :
@@ -706,6 +710,11 @@ async def call(self, ast_ctx, *args, **kwargs):
706
710
f"{ self .name } () missing { self .num_posn_arg - i } required positional arguments"
707
711
)
708
712
sym_table [var_name ] = val
713
+ if len (bad_kwargs ) > 0 :
714
+ raise TypeError (
715
+ f"{ self .name } () got some positional-only arguments passed as keyword arguments: '{ ', ' .join (bad_kwargs )} '"
716
+ )
717
+
709
718
for i , kwonlyarg in enumerate (self .func_def .args .kwonlyargs ):
710
719
var_name = kwonlyarg .arg
711
720
if var_name in kwargs :
@@ -724,12 +733,13 @@ async def call(self, ast_ctx, *args, **kwargs):
724
733
# since they could have non-trigger decorators too
725
734
unexpected = ", " .join (sorted (set (kwargs .keys ()) - TRIGGER_KWARGS ))
726
735
raise TypeError (f"{ self .name } () called with unexpected keyword arguments: { unexpected } " )
736
+ num_posn = self .num_posonly_arg + len (self .func_def .args .args )
727
737
if self .func_def .args .vararg :
728
- if len (args ) > len ( self . func_def . args . args ) :
729
- sym_table [self .func_def .args .vararg .arg ] = tuple (args [len ( self . func_def . args . args ) :])
738
+ if len (args ) > num_posn :
739
+ sym_table [self .func_def .args .vararg .arg ] = tuple (args [num_posn :])
730
740
else :
731
741
sym_table [self .func_def .args .vararg .arg ] = ()
732
- elif len (args ) > len ( self . func_def . args . args ) :
742
+ elif len (args ) > num_posn :
733
743
raise TypeError (f"{ self .name } () called with too many positional arguments" )
734
744
for name , value in self .local_sym_table .items ():
735
745
if name in sym_table :
0 commit comments