aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2022-12-16 12:30:47 -0800
committerGitHub <noreply@github.com>2022-12-16 12:30:47 -0800
commita5a7cea202d34ca699d9594d428ba527ef7ff2ce (patch)
tree5176c390d975ad480718c43245f02a78a55a2b39 /Lib/test
parent5234e1cbea686e38392f113707db322ad8405048 (diff)
downloadcpython-a5a7cea202d34ca699d9594d428ba527ef7ff2ce.tar.gz
cpython-a5a7cea202d34ca699d9594d428ba527ef7ff2ce.zip
gh-100039: enhance __signature__ to work with str and callables (GH-100168)
Callables should be either class- or static-methods. Enum now uses the classmethod version to greatly improve the help given for enums and flags.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_enum.py25
-rw-r--r--Lib/test/test_inspect.py32
2 files changed, 55 insertions, 2 deletions
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index d876c8e5fb7..1e653e94f6b 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -4259,7 +4259,7 @@ expected_help_output_with_docs = """\
Help on class Color in module %s:
class Color(enum.Enum)
- | Color(value, names=None, *values, module=None, qualname=None, type=None, start=1, boundary=None)
+ | Color(*values)
|
| Method resolution order:
| Color
@@ -4315,7 +4315,7 @@ expected_help_output_without_docs = """\
Help on class Color in module %s:
class Color(enum.Enum)
- | Color(value, names=None, *values, module=None, qualname=None, type=None, start=1)
+ | Color(*values)
|
| Method resolution order:
| Color
@@ -4462,6 +4462,27 @@ class TestStdLib(unittest.TestCase):
if failed:
self.fail("result does not equal expected, see print above")
+ def test_inspect_signatures(self):
+ from inspect import signature, Signature, Parameter
+ self.assertEqual(
+ signature(Enum),
+ 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),
+ ]),
+ )
+ self.assertEqual(
+ signature(enum.FlagBoundary),
+ Signature([
+ Parameter('values', Parameter.VAR_POSITIONAL),
+ ]),
+ )
+
def test_test_simple_enum(self):
@_simple_enum(Enum)
class SimpleColor:
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 2b7977b1648..0f8217ba3b7 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -3614,6 +3614,38 @@ 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')),
+ ...))
+
class TestParameterObject(unittest.TestCase):
def test_signature_parameter_kinds(self):