@@ -250,9 +250,9 @@ def funcdef(self, nodelist):
250250 args = nodelist [- 3 ][2 ]
251251
252252 if args [0 ] == symbol .varargslist :
253- names , defaults , flags = self .com_arglist (args [1 :])
253+ names , defaults , kwonlyargs , flags = self .com_arglist (args [1 :])
254254 else :
255- names = defaults = ()
255+ names = defaults = kwonlyargs = ()
256256 flags = 0
257257 doc = self .get_docstring (nodelist [- 1 ])
258258
@@ -263,21 +263,23 @@ def funcdef(self, nodelist):
263263 assert isinstance (code , Stmt )
264264 assert isinstance (code .nodes [0 ], Discard )
265265 del code .nodes [0 ]
266- return Function (decorators , name , names , defaults , flags , doc , code ,
267- lineno = lineno )
266+ return Function (decorators , name , names , defaults ,
267+ kwonlyargs , flags , doc , code , lineno = lineno )
268268
269269 def lambdef (self , nodelist ):
270270 # lambdef: 'lambda' [varargslist] ':' test
271271 if nodelist [2 ][0 ] == symbol .varargslist :
272- names , defaults , flags = self .com_arglist (nodelist [2 ][1 :])
272+ names , defaults , kwonlyargs , flags = \
273+ self .com_arglist (nodelist [2 ][1 :])
273274 else :
274- names = defaults = ()
275+ names = defaults = kwonlyargs = ()
275276 flags = 0
276277
277278 # code for lambda
278279 code = self .com_node (nodelist [- 1 ])
279280
280- return Lambda (names , defaults , flags , code , lineno = nodelist [1 ][2 ])
281+ return Lambda (names , defaults , kwonlyargs ,
282+ flags , code , lineno = nodelist [1 ][2 ])
281283 old_lambdef = lambdef
282284
283285 def classdef (self , nodelist ):
@@ -783,13 +785,37 @@ def com_NEWLINE(self, *args):
783785 # ('const', xxxx)) Nodes)
784786 return Discard (Const (None ))
785787
788+ def keywordonlyargs (self , nodelist ):
789+ # (',' NAME ['=' test])*
790+ # ^^^
791+ # ------+
792+ kwonlyargs = []
793+ i = 0
794+ while i < len (nodelist ):
795+ default = EmptyNode ()
796+ node = nodelist [i ]
797+ #assert node[0] == token.COMMA
798+ #node = nodelist[i+1]
799+ if i + 1 < len (nodelist ) and nodelist [i + 1 ][0 ] == token .EQUAL :
800+ assert i + 2 < len (nodelist )
801+ default = self .com_node (nodelist [i + 2 ])
802+ i += 2
803+ if node [0 ] == token .DOUBLESTAR :
804+ return kwonlyargs , i
805+ elif node [0 ] == token .NAME :
806+ kwonlyargs .append (Keyword (node [1 ], default , lineno = node [2 ]))
807+ i += 2
808+ return kwonlyargs , i
809+
786810 def com_arglist (self , nodelist ):
787811 # varargslist:
788- # (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
789- # | fpdef ['=' test] (',' fpdef ['=' test])* [',']
812+ # (fpdef ['=' test] ',')*
813+ # ('*' [NAME] (',' NAME '=' test)* [',' '**' NAME] | '**' NAME)
814+ # | fpdef ['=' test] (',' fpdef ['=' test])* [',']
790815 # fpdef: NAME | '(' fplist ')'
791816 # fplist: fpdef (',' fpdef)* [',']
792817 names = []
818+ kwonlyargs = []
793819 defaults = []
794820 flags = 0
795821
@@ -799,10 +825,22 @@ def com_arglist(self, nodelist):
799825 if node [0 ] == token .STAR or node [0 ] == token .DOUBLESTAR :
800826 if node [0 ] == token .STAR :
801827 node = nodelist [i + 1 ]
802- if node [0 ] == token .NAME :
828+ if node [0 ] == token .NAME : # vararg
803829 names .append (node [1 ])
804830 flags = flags | CO_VARARGS
805831 i = i + 3
832+ else : # no vararg
833+ assert node [0 ] == token .COMMA
834+ i += 1
835+ #elif node[0] == token.COMMA:
836+ # i += 1
837+ # kwonlyargs, skip = self.keywordonlyargs(nodelist[i:])
838+ # i += skip
839+ if nodelist [i ][0 ] == token .NAME :
840+ kwonlyargs , skip = self .keywordonlyargs (nodelist [i :])
841+ i += skip
842+
843+ print "kwonlyargs:" , kwonlyargs
806844
807845 if i < len (nodelist ):
808846 # should be DOUBLESTAR
@@ -831,7 +869,8 @@ def com_arglist(self, nodelist):
831869 # skip the comma
832870 i = i + 1
833871
834- return names , defaults , flags
872+ print "names:" , names , "defaults:" , defaults , "kwonlyargs:" , kwonlyargs , "flags:" , flags
873+ return names , defaults , kwonlyargs , flags
835874
836875 def com_fpdef (self , node ):
837876 # fpdef: NAME | '(' fplist ')'
0 commit comments