summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSergey B Kirpichev <skirpichev@gmail.com>2024-10-08 19:36:03 (GMT)
committerGitHub <noreply@github.com>2024-10-08 19:36:03 (GMT)
commiteafd14fbe0fd464b9d700f6d00137415193aa143 (patch)
tree487ad48da33c7761a45287a4c85f69c5dcc56201 /Lib
parentb2a7272408593355c4c8e1d2ce9018cf96691bea (diff)
downloadcpython-eafd14fbe0fd464b9d700f6d00137415193aa143.zip
cpython-eafd14fbe0fd464b9d700f6d00137415193aa143.tar.gz
cpython-eafd14fbe0fd464b9d700f6d00137415193aa143.tar.bz2
gh-116110: remove extra processing for the __signature__ attribute (GH-116234)
This is an alternative to GH-100168.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/enum.py22
-rw-r--r--Lib/inspect.py10
-rw-r--r--Lib/test/test_inspect/test_inspect.py32
3 files changed, 16 insertions, 48 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index 9d53eb8..17d7273 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -1092,6 +1092,21 @@ class EnumType(type):
# now add to _member_map_ (even aliases)
cls._member_map_[name] = member
+ @property
+ def __signature__(cls):
+ from inspect import Parameter, Signature
+ if cls._member_names_:
+ return Signature([Parameter('values', Parameter.VAR_POSITIONAL)])
+ else:
+ return Signature([Parameter('new_class_name', Parameter.POSITIONAL_ONLY),
+ Parameter('names', Parameter.POSITIONAL_OR_KEYWORD),
+ Parameter('module', Parameter.KEYWORD_ONLY, default=None),
+ Parameter('qualname', Parameter.KEYWORD_ONLY, default=None),
+ Parameter('type', Parameter.KEYWORD_ONLY, default=None),
+ Parameter('start', Parameter.KEYWORD_ONLY, default=1),
+ Parameter('boundary', Parameter.KEYWORD_ONLY, default=None)])
+
+
EnumMeta = EnumType # keep EnumMeta name for backwards compatibility
@@ -1135,13 +1150,6 @@ class Enum(metaclass=EnumType):
attributes -- see the documentation for details.
"""
- @classmethod
- def __signature__(cls):
- if cls._member_names_:
- return '(*values)'
- else:
- return '(new_class_name, /, names, *, module=None, qualname=None, type=None, start=1, boundary=None)'
-
def __new__(cls, value):
# all enum instances are actually created during class construction
# without calling this method; this method is called by the metaclass'
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 1731456..1763ef6 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -2424,18 +2424,10 @@ def _signature_from_callable(obj, *,
pass
else:
if sig is not None:
- # since __text_signature__ is not writable on classes, __signature__
- # may contain text (or be a callable that returns text);
- # if so, convert it
- o_sig = sig
- if not isinstance(sig, (Signature, str)) and callable(sig):
- sig = sig()
- if isinstance(sig, str):
- sig = _signature_fromstr(sigcls, obj, sig)
if not isinstance(sig, Signature):
raise TypeError(
'unexpected object {!r} in __signature__ '
- 'attribute'.format(o_sig))
+ 'attribute'.format(sig))
return sig
try:
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index d2dc9e1..2ecb7ec 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -4879,38 +4879,6 @@ class TestSignatureObject(unittest.TestCase):
self.assertEqual(signature_func(foo), inspect.Signature())
self.assertEqual(inspect.get_annotations(foo), {})
- def test_signature_as_str(self):
- self.maxDiff = None
- class S:
- __signature__ = '(a, b=2)'
-
- self.assertEqual(self.signature(S),
- ((('a', ..., ..., 'positional_or_keyword'),
- ('b', 2, ..., 'positional_or_keyword')),
- ...))
-
- def test_signature_as_callable(self):
- # __signature__ should be either a staticmethod or a bound classmethod
- class S:
- @classmethod
- def __signature__(cls):
- return '(a, b=2)'
-
- self.assertEqual(self.signature(S),
- ((('a', ..., ..., 'positional_or_keyword'),
- ('b', 2, ..., 'positional_or_keyword')),
- ...))
-
- class S:
- @staticmethod
- def __signature__():
- return '(a, b=2)'
-
- self.assertEqual(self.signature(S),
- ((('a', ..., ..., 'positional_or_keyword'),
- ('b', 2, ..., 'positional_or_keyword')),
- ...))
-
def test_signature_on_derived_classes(self):
# gh-105080: Make sure that signatures are consistent on derived classes