summaryrefslogtreecommitdiffstats
path: root/Lib/inspect.py
diff options
context:
space:
mode:
authorYury Selivanov <yselivanov@sprymix.com>2014-01-29 15:58:16 (GMT)
committerYury Selivanov <yselivanov@sprymix.com>2014-01-29 15:58:16 (GMT)
commit07a9e452accb432bd9da20b20e13f4bf8feebacb (patch)
tree96e3639f7613edf1d67828ecefd95cadf85938fb /Lib/inspect.py
parent76c6c593ed0e85332a3d320c57cf032d22410426 (diff)
downloadcpython-07a9e452accb432bd9da20b20e13f4bf8feebacb.zip
cpython-07a9e452accb432bd9da20b20e13f4bf8feebacb.tar.gz
cpython-07a9e452accb432bd9da20b20e13f4bf8feebacb.tar.bz2
inspect.Signature: ensure that non-default params don't follow default ones #20427
Diffstat (limited to 'Lib/inspect.py')
-rw-r--r--Lib/inspect.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index f0c1247..f06138c 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -1924,6 +1924,7 @@ class Signature:
if __validate_parameters__:
params = OrderedDict()
top_kind = _POSITIONAL_ONLY
+ kind_defaults = False
for idx, param in enumerate(parameters):
kind = param.kind
@@ -1933,9 +1934,27 @@ class Signature:
msg = 'wrong parameter order: {} before {}'
msg = msg.format(top_kind, kind)
raise ValueError(msg)
- else:
+ elif kind > top_kind:
+ kind_defaults = False
top_kind = kind
+ if (kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD) and
+ not param._partial_kwarg):
+ # If we have a positional-only or positional-or-keyword
+ # parameter, that does not have its default value set
+ # by 'functools.partial' or other "partial" signature:
+ if param.default is _empty:
+ if kind_defaults:
+ # No default for this parameter, but the
+ # previous parameter of the same kind had
+ # a default
+ msg = 'non-default argument follows default ' \
+ 'argument'
+ raise ValueError(msg)
+ else:
+ # There is a default for this parameter.
+ kind_defaults = True
+
if name in params:
msg = 'duplicate parameter name: {!r}'.format(name)
raise ValueError(msg)