Skip to content

Commit 0d1e022

Browse files
committed
BUG: Fix repr-ing function parameter default values
Fixes #116 Fixes #122 Fixes #123 Thanks.
1 parent 1b644f6 commit 0d1e022

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

pdoc/__init__.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
.. include:: ./documentation.md
99
"""
1010
import ast
11+
import enum
1112
import importlib.machinery
1213
import importlib.util
1314
import inspect
@@ -1093,21 +1094,27 @@ def _params(func_obj, annotate=False, link=None, module=None):
10931094
return ["..."]
10941095

10951096
def safe_default_value(p: inspect.Parameter):
1096-
if p.default is inspect.Parameter.empty:
1097+
value = p.default
1098+
if value is inspect.Parameter.empty:
10971099
return p
10981100

1099-
replacement = None
1100-
if p.default is os.environ:
1101-
replacement = 'os.environ'
1102-
elif inspect.isclass(p.default):
1103-
replacement = p.default.__module__ + '.' + p.default.__qualname__
1104-
elif ' at 0x' in repr(p.default):
1105-
replacement = re.sub(r' at 0x\w+', '', repr(p.default))
1106-
1107-
nonlocal link
1108-
if link and ('<' in repr(p.default) or '>' in repr(p.default)):
1109-
import html
1110-
replacement = html.escape(replacement or p.default)
1101+
replacement = next((i for i in ('os.environ',
1102+
'sys.stdin',
1103+
'sys.stdout',
1104+
'sys.stderr',)
1105+
if value is eval(i)), None)
1106+
if not replacement:
1107+
if isinstance(value, enum.Enum):
1108+
replacement = str(value)
1109+
elif inspect.isclass(value):
1110+
replacement = value.__module__ + '.' + value.__qualname__
1111+
elif ' at 0x' in repr(value):
1112+
replacement = re.sub(r' at 0x\w+', '', repr(value))
1113+
1114+
nonlocal link
1115+
if link and ('<' in repr(value) or '>' in repr(value)):
1116+
import html
1117+
replacement = html.escape(replacement or repr(value))
11111118

11121119
if replacement:
11131120
class mock:

pdoc/test/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""
22
Unit tests for pdoc package.
33
"""
4+
import enum
45
import inspect
56
import os
67
import shutil
@@ -633,8 +634,13 @@ def test_Function_params(self):
633634
self.assertEqual(func.params(), ['a', '*', 'b', 'c'])
634635

635636
func = pdoc.Function('f', mod,
636-
lambda a=os.environ: None)
637-
self.assertEqual(func.params(), ['a=os.environ'])
637+
lambda a=os.environ, b=sys.stdout: None)
638+
self.assertEqual(func.params(), ['a=os.environ', 'b=sys.stdout'])
639+
640+
class Foo(enum.Enum):
641+
a, b = 1, 2
642+
func = pdoc.Function('f', mod, lambda a=Foo.a: None)
643+
self.assertEqual(func.params(), ['a=Foo.a'])
638644

639645
func = pdoc.Function('f', mod, lambda a=object(): None)
640646
self.assertEqual(func.params(), ['a=<object object>'])

0 commit comments

Comments
 (0)