5454 'constant' , 'continue' , 'delete' , 'dict' , 'dictcomp' ,
5555 'excepthandler' , 'expr' , 'extslice' , 'for' ,
5656 'functiondef' , 'if' , 'ifexp' , 'import' , 'importfrom' ,
57- 'index' , 'interrupt' , 'list ' , 'listcomp ' , 'module ' ,
58- 'name' , 'pass' , 'raise' , 'repr' , 'return' , 'set ' ,
59- 'setcomp' , 'slice' , 'subscript' , 'try' , 'tuple' ,
57+ 'index' , 'interrupt' , 'lambda ' , 'list ' , 'listcomp ' ,
58+ 'module' , ' name' , 'pass' , 'raise' , 'repr' , 'return' ,
59+ 'set' , ' setcomp' , 'slice' , 'subscript' , 'try' , 'tuple' ,
6060 'unaryop' , 'while' , 'with' , 'formattedvalue' ,
6161 'joinedstr' ]
6262
6565DEFAULT_CONFIG = {'import' : False , 'importfrom' : False }
6666
6767for _tnode in ('assert' , 'augassign' , 'delete' , 'if' , 'ifexp' , 'for' ,
68- 'formattedvalue' , 'functiondef' , 'print' , 'raise' , 'listcomp' ,
69- 'dictcomp' , 'setcomp' , 'try' , 'while' , 'with' ):
68+ 'formattedvalue' , 'functiondef' , 'print' , 'raise' ,
69+ 'lambda' , 'listcomp' , 'dictcomp' , 'setcomp' , 'try' ,
70+ 'while' , 'with' ):
7071 MINIMAL_CONFIG [_tnode ] = False
7172 DEFAULT_CONFIG [_tnode ] = True
7273
@@ -103,7 +104,7 @@ class Interpreter:
103104 -----
104105 1. setting `minimal=True` is equivalent to setting a config with the following
105106 nodes disabled: ('import', 'importfrom', 'if', 'for', 'while', 'try', 'with',
106- 'functiondef', 'ifexp', 'listcomp', 'dictcomp', 'setcomp', 'augassign',
107+ 'functiondef', 'ifexp', 'lambda', ' listcomp', 'dictcomp', 'setcomp', 'augassign',
107108 'assert', 'delete', 'raise', 'print')
108109 2. by default 'import' and 'importfrom' are disabled, though they can be enabled.
109110 """
@@ -951,18 +952,24 @@ def on_arg(self, node): # ('test', 'msg')
951952 """Arg for function definitions."""
952953 return node .arg
953954
954- def on_functiondef (self , node ):
955+ def on_functiondef (self , node , is_lambda = False ):
955956 """Define procedures."""
956957 # ('name', 'args', 'body', 'decorator_list')
957- if node .decorator_list :
958- raise Warning ("decorated procedures not supported!" )
959- kwargs = []
960-
961- if (not valid_symbol_name (node .name ) or
962- node .name in self .readonly_symbols ):
963- errmsg = f"invalid function name (reserved word?) { node .name } "
964- self .raise_exception (node , exc = NameError , msg = errmsg )
958+ if is_lambda :
959+ name = 'lambda'
960+ body = [node .body ]
961+ else :
962+ name = node .name
963+ body = node .body
964+
965+ if node .decorator_list :
966+ raise Warning ("decorated procedures not supported!" )
967+ if (not valid_symbol_name (name ) or
968+ name in self .readonly_symbols ):
969+ errmsg = f"invalid function name (reserved word?) { name } "
970+ self .raise_exception (node , exc = NameError , msg = errmsg )
965971
972+ kwargs = []
966973 offset = len (node .args .args ) - len (node .args .defaults )
967974 for idef , defnode in enumerate (node .args .defaults ):
968975 defval = self .run (defnode )
@@ -971,7 +978,7 @@ def on_functiondef(self, node):
971978
972979 args = [tnode .arg for tnode in node .args .args [:offset ]]
973980 doc = None
974- nb0 = node . body [0 ]
981+ nb0 = body [0 ]
975982 if isinstance (nb0 , ast .Expr ) and isinstance (nb0 .value , ast .Constant ):
976983 doc = nb0 .value
977984 varkws = node .args .kwarg
@@ -980,11 +987,19 @@ def on_functiondef(self, node):
980987 vararg = vararg .arg
981988 if isinstance (varkws , ast .arg ):
982989 varkws = varkws .arg
983- self .symtable [node .name ] = Procedure (node .name , self , doc = doc ,
984- lineno = self .lineno ,
985- body = node .body ,
986- text = ast .unparse (node ),
987- args = args , kwargs = kwargs ,
988- vararg = vararg , varkws = varkws )
989- if node .name in self .no_deepcopy :
990- self .no_deepcopy .remove (node .name )
990+
991+ proc = Procedure (name , self , doc = doc , lineno = self .lineno ,
992+ body = body , text = ast .unparse (node ),
993+ args = args , kwargs = kwargs , vararg = vararg ,
994+ varkws = varkws , is_lambda = is_lambda )
995+
996+ if is_lambda :
997+ return proc
998+ else :
999+ self .symtable [name ] = proc
1000+ if name in self .no_deepcopy :
1001+ self .no_deepcopy .remove (name )
1002+
1003+ def on_lambda (self , node ):
1004+ """Lambda."""
1005+ return self .on_functiondef (node , is_lambda = True )
0 commit comments