@@ -32,36 +32,45 @@ class Enum(object):
32
32
@py2to3
33
33
class ArgumentSpec (object ):
34
34
35
- def __init__ (self , name = None , type = 'Keyword' , positional = None ,
36
- varargs = None , kwonlyargs = None , kwargs = None , defaults = None ,
37
- types = None , supports_named = True ):
35
+ def __init__ (self , name = None , type = 'Keyword' , positional_only = None ,
36
+ positional_or_named = None , var_positional = None , named_only = None ,
37
+ var_named = None , defaults = None , types = None , supports_named = True ):
38
38
self .name = name
39
39
self .type = type
40
- self .positional = positional or []
41
- self .varargs = varargs
42
- self .kwonlyargs = kwonlyargs or []
43
- self .kwargs = kwargs
40
+ self .positional_only = positional_only or []
41
+ self .positional_or_named = positional_or_named or []
42
+ self .var_positional = var_positional
43
+ self .named_only = named_only or []
44
+ self .var_named = var_named
44
45
self .defaults = defaults or {}
45
46
self .types = types
47
+ # FIXME: Shouldn't be needed anymore when positional-only are fully supported.
46
48
self .supports_named = supports_named
47
49
48
50
@setter
49
51
def types (self , types ):
50
52
return TypeValidator (self ).validate (types )
51
53
54
+ @property
55
+ def positional (self ):
56
+ return self .positional_only + self .positional_or_named
57
+
52
58
@property
53
59
def minargs (self ):
54
60
required = [arg for arg in self .positional if arg not in self .defaults ]
55
61
return len (required )
56
62
57
63
@property
58
64
def maxargs (self ):
59
- return len (self .positional ) if not self .varargs else sys .maxsize
65
+ return len (self .positional ) if not self .var_positional else sys .maxsize
60
66
61
67
@property
62
68
def argument_names (self ):
63
- return (self .positional + ([self .varargs ] if self .varargs else []) +
64
- self .kwonlyargs + ([self .kwargs ] if self .kwargs else []))
69
+ return (self .positional_only +
70
+ self .positional_or_named +
71
+ ([self .var_positional ] if self .var_positional else []) +
72
+ self .named_only +
73
+ ([self .var_named ] if self .var_named else []))
65
74
66
75
def resolve (self , arguments , variables = None , resolve_named = True ,
67
76
resolve_variables_until = None , dict_to_kwargs = False ):
@@ -81,20 +90,25 @@ def __iter__(self):
81
90
notset = ArgInfo .NOTSET
82
91
get_type = (self .types or {}).get
83
92
get_default = self .defaults .get
84
- for arg in self .positional :
85
- yield ArgInfo (ArgInfo .POSITIONAL_OR_KEYWORD , arg ,
93
+ for arg in self .positional_only :
94
+ yield ArgInfo (ArgInfo .POSITIONAL_ONLY , arg ,
95
+ get_type (arg , notset ), get_default (arg , notset ))
96
+ if self .positional_only :
97
+ yield ArgInfo (ArgInfo .POSITIONAL_ONLY_MARKER )
98
+ for arg in self .positional_or_named :
99
+ yield ArgInfo (ArgInfo .POSITIONAL_OR_NAMED , arg ,
86
100
get_type (arg , notset ), get_default (arg , notset ))
87
- if self .varargs :
88
- yield ArgInfo (ArgInfo .VAR_POSITIONAL , self .varargs ,
89
- get_type (self .varargs , notset ))
90
- elif self .kwonlyargs :
91
- yield ArgInfo (ArgInfo .KEYWORD_ONLY_MARKER )
92
- for arg in self .kwonlyargs :
93
- yield ArgInfo (ArgInfo .KEYWORD_ONLY , arg ,
101
+ if self .var_positional :
102
+ yield ArgInfo (ArgInfo .VAR_POSITIONAL , self .var_positional ,
103
+ get_type (self .var_positional , notset ))
104
+ elif self .named_only :
105
+ yield ArgInfo (ArgInfo .NAMED_ONLY_MARKER )
106
+ for arg in self .named_only :
107
+ yield ArgInfo (ArgInfo .NAMED_ONLY , arg ,
94
108
get_type (arg , notset ), get_default (arg , notset ))
95
- if self .kwargs :
96
- yield ArgInfo (ArgInfo .VAR_KEYWORD , self .kwargs ,
97
- get_type (self .kwargs , notset ))
109
+ if self .var_named :
110
+ yield ArgInfo (ArgInfo .VAR_NAMED , self .var_named ,
111
+ get_type (self .var_named , notset ))
98
112
99
113
def __unicode__ (self ):
100
114
return ', ' .join (unicode (arg ) for arg in self )
@@ -103,11 +117,13 @@ def __unicode__(self):
103
117
@py2to3
104
118
class ArgInfo (object ):
105
119
NOTSET = object ()
106
- POSITIONAL_OR_KEYWORD = 'POSITIONAL_OR_KEYWORD'
120
+ POSITIONAL_ONLY = 'POSITIONAL_ONLY'
121
+ POSITIONAL_ONLY_MARKER = 'POSITIONAL_ONLY_MARKER'
122
+ POSITIONAL_OR_NAMED = 'POSITIONAL_OR_NAMED'
107
123
VAR_POSITIONAL = 'VAR_POSITIONAL'
108
- KEYWORD_ONLY_MARKER = 'KEYWORD_ONLY_MARKER '
109
- KEYWORD_ONLY = 'KEYWORD_ONLY '
110
- VAR_KEYWORD = 'VAR_KEYWORD '
124
+ NAMED_ONLY_MARKER = 'NAMED_ONLY_MARKER '
125
+ NAMED_ONLY = 'NAMED_ONLY '
126
+ VAR_NAMED = 'VAR_NAMED '
111
127
112
128
def __init__ (self , kind , name = '' , type = NOTSET , default = NOTSET ):
113
129
self .kind = kind
@@ -117,7 +133,9 @@ def __init__(self, kind, name='', type=NOTSET, default=NOTSET):
117
133
118
134
@property
119
135
def required (self ):
120
- if self .kind in (self .POSITIONAL_OR_KEYWORD , self .KEYWORD_ONLY ):
136
+ if self .kind in (self .POSITIONAL_ONLY ,
137
+ self .POSITIONAL_OR_NAMED ,
138
+ self .NAMED_ONLY ):
121
139
return self .default is self .NOTSET
122
140
return False
123
141
@@ -141,12 +159,14 @@ def _format_enum(self, enum):
141
159
return '%s { %s }' % (enum .__name__ , ' | ' .join (members ))
142
160
143
161
def __unicode__ (self ):
144
- if self .kind == self .KEYWORD_ONLY_MARKER :
162
+ if self .kind == self .POSITIONAL_ONLY_MARKER :
163
+ return '/'
164
+ if self .kind == self .NAMED_ONLY_MARKER :
145
165
return '*'
146
166
ret = self .name
147
167
if self .kind == self .VAR_POSITIONAL :
148
168
ret = '*' + ret
149
- elif self .kind == self .VAR_KEYWORD :
169
+ elif self .kind == self .VAR_NAMED :
150
170
ret = '**' + ret
151
171
if self .type is not self .NOTSET :
152
172
ret = '%s: %s' % (ret , self .type_string )
0 commit comments