import types
import functools
import builtins
+from keyword import iskeyword
from operator import attrgetter
from collections import namedtuple, OrderedDict
instance = super().__new__(cls, filename, lineno, function, code_context, index)
instance.positions = positions
return instance
-
+
def __repr__(self):
return ('Traceback(filename={!r}, lineno={!r}, function={!r}, '
'code_context={!r}, index={!r}, positions={!r})'.format(
frame, *positions = (frame, lineno, *positions[1:])
else:
frame, *positions = (frame, *positions)
-
+
lineno = positions[0]
if not isframe(frame):
self._kind = _POSITIONAL_ONLY
name = 'implicit{}'.format(name[1:])
- if not name.isidentifier():
+ # It's possible for C functions to have a positional-only parameter
+ # where the name is a keyword, so for compatibility we'll allow it.
+ is_keyword = iskeyword(name) and self._kind is not _POSITIONAL_ONLY
+ if is_keyword or not name.isidentifier():
raise ValueError('{!r} is not a valid parameter name'.format(name))
self._name = name
with self.assertRaisesRegex(ValueError, 'not a valid parameter name'):
inspect.Parameter('1', kind=inspect.Parameter.VAR_KEYWORD)
+ with self.assertRaisesRegex(ValueError, 'not a valid parameter name'):
+ inspect.Parameter('from', kind=inspect.Parameter.VAR_KEYWORD)
+
with self.assertRaisesRegex(TypeError, 'name must be a str'):
inspect.Parameter(None, kind=inspect.Parameter.VAR_KEYWORD)