mirror of
https://github.com/python/cpython.git
synced 2025-07-25 04:04:13 +00:00
gh-92062: inspect.Parameter
checks whether name
is a keyword (GH-92065)
Fixes #92062.
This commit is contained in:
parent
3a35b62ea0
commit
65f88a6ef7
3 changed files with 12 additions and 3 deletions
|
@ -149,6 +149,7 @@ import token
|
||||||
import types
|
import types
|
||||||
import functools
|
import functools
|
||||||
import builtins
|
import builtins
|
||||||
|
from keyword import iskeyword
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
from collections import namedtuple, OrderedDict
|
from collections import namedtuple, OrderedDict
|
||||||
|
|
||||||
|
@ -2707,7 +2708,10 @@ class Parameter:
|
||||||
self._kind = _POSITIONAL_ONLY
|
self._kind = _POSITIONAL_ONLY
|
||||||
name = 'implicit{}'.format(name[1:])
|
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))
|
raise ValueError('{!r} is not a valid parameter name'.format(name))
|
||||||
|
|
||||||
self._name = name
|
self._name = name
|
||||||
|
|
|
@ -3604,6 +3604,9 @@ class TestParameterObject(unittest.TestCase):
|
||||||
with self.assertRaisesRegex(ValueError, 'not a valid parameter name'):
|
with self.assertRaisesRegex(ValueError, 'not a valid parameter name'):
|
||||||
inspect.Parameter('1', kind=inspect.Parameter.VAR_KEYWORD)
|
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'):
|
with self.assertRaisesRegex(TypeError, 'name must be a str'):
|
||||||
inspect.Parameter(None, kind=inspect.Parameter.VAR_KEYWORD)
|
inspect.Parameter(None, kind=inspect.Parameter.VAR_KEYWORD)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:class:`inspect.Parameter` now raises :exc:`ValueError` if ``name`` is
|
||||||
|
a keyword, in addition to the existing check that it is an identifier.
|
Loading…
Add table
Add a link
Reference in a new issue