Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
d53cf99d
Commit
d53cf99d
authored
May 06, 2019
by
Serhiy Storchaka
Committed by
GitHub
May 06, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bpo-36542: Allow to overwrite the signature for Python functions. (GH-12705)
parent
96aeaec6
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
40 additions
and
3 deletions
+40
-3
Lib/bdb.py
Lib/bdb.py
+1
-0
Lib/cProfile.py
Lib/cProfile.py
+1
-0
Lib/collections/__init__.py
Lib/collections/__init__.py
+2
-0
Lib/concurrent/futures/_base.py
Lib/concurrent/futures/_base.py
+1
-0
Lib/concurrent/futures/process.py
Lib/concurrent/futures/process.py
+1
-0
Lib/concurrent/futures/thread.py
Lib/concurrent/futures/thread.py
+1
-0
Lib/contextlib.py
Lib/contextlib.py
+2
-0
Lib/curses/__init__.py
Lib/curses/__init__.py
+1
-0
Lib/functools.py
Lib/functools.py
+1
-0
Lib/inspect.py
Lib/inspect.py
+7
-2
Lib/multiprocessing/managers.py
Lib/multiprocessing/managers.py
+2
-0
Lib/profile.py
Lib/profile.py
+1
-0
Lib/test/test_inspect.py
Lib/test/test_inspect.py
+11
-0
Lib/trace.py
Lib/trace.py
+1
-0
Lib/unittest/case.py
Lib/unittest/case.py
+4
-1
Lib/weakref.py
Lib/weakref.py
+1
-0
Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst
...S.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst
+2
-0
No files found.
Lib/bdb.py
View file @
d53cf99d
...
...
@@ -649,6 +649,7 @@ class Bdb:
self
.
quitting
=
True
sys
.
settrace
(
None
)
return
res
runcall
.
__text_signature__
=
'($self, func, /, *args, **kwds)'
def
set_trace
():
...
...
Lib/cProfile.py
View file @
d53cf99d
...
...
@@ -124,6 +124,7 @@ class Profile(_lsprof.Profiler):
return
func
(
*
args
,
**
kw
)
finally
:
self
.
disable
()
runcall
.
__text_signature__
=
'($self, func, /, *args, **kw)'
def
__enter__
(
self
):
self
.
enable
()
...
...
Lib/collections/__init__.py
View file @
d53cf99d
...
...
@@ -1018,6 +1018,8 @@ class UserDict(_collections_abc.MutableMapping):
self
.
update
(
dict
)
if
kwargs
:
self
.
update
(
kwargs
)
__init__
.
__text_signature__
=
'($self, dict=None, /, **kwargs)'
def
__len__
(
self
):
return
len
(
self
.
data
)
def
__getitem__
(
self
,
key
):
if
key
in
self
.
data
:
...
...
Lib/concurrent/futures/_base.py
View file @
d53cf99d
...
...
@@ -567,6 +567,7 @@ class Executor(object):
'got %d'
%
(
len
(
args
)
-
1
))
raise
NotImplementedError
()
submit
.
__text_signature__
=
'($self, fn, /, *args, **kwargs)'
def
map
(
self
,
fn
,
*
iterables
,
timeout
=
None
,
chunksize
=
1
):
"""Returns an iterator equivalent to map(fn, iter).
...
...
Lib/concurrent/futures/process.py
View file @
d53cf99d
...
...
@@ -630,6 +630,7 @@ class ProcessPoolExecutor(_base.Executor):
self
.
_start_queue_management_thread
()
return
f
submit
.
__text_signature__
=
_base
.
Executor
.
submit
.
__text_signature__
submit
.
__doc__
=
_base
.
Executor
.
submit
.
__doc__
def
map
(
self
,
fn
,
*
iterables
,
timeout
=
None
,
chunksize
=
1
):
...
...
Lib/concurrent/futures/thread.py
View file @
d53cf99d
...
...
@@ -174,6 +174,7 @@ class ThreadPoolExecutor(_base.Executor):
self
.
_work_queue
.
put
(
w
)
self
.
_adjust_thread_count
()
return
f
submit
.
__text_signature__
=
_base
.
Executor
.
submit
.
__text_signature__
submit
.
__doc__
=
_base
.
Executor
.
submit
.
__doc__
def
_adjust_thread_count
(
self
):
...
...
Lib/contextlib.py
View file @
d53cf99d
...
...
@@ -454,6 +454,7 @@ class _BaseExitStack:
_exit_wrapper
.
__wrapped__
=
callback
self
.
_push_exit_callback
(
_exit_wrapper
)
return
callback
# Allow use as a decorator
callback
.
__text_signature__
=
'($self, callback, /, *args, **kwds)'
def
_push_cm_exit
(
self
,
cm
,
cm_exit
):
"""Helper to correctly register callbacks to __exit__ methods."""
...
...
@@ -615,6 +616,7 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager):
_exit_wrapper
.
__wrapped__
=
callback
self
.
_push_exit_callback
(
_exit_wrapper
,
False
)
return
callback
# Allow use as a decorator
push_async_callback
.
__text_signature__
=
'($self, callback, /, *args, **kwds)'
async
def
aclose
(
self
):
"""Immediately unwind the context stack."""
...
...
Lib/curses/__init__.py
View file @
d53cf99d
...
...
@@ -110,3 +110,4 @@ def wrapper(*args, **kwds):
echo
()
nocbreak
()
endwin
()
wrapper
.
__text_signature__
=
'(func, /, *args, **kwds)'
Lib/functools.py
View file @
d53cf99d
...
...
@@ -388,6 +388,7 @@ class partialmethod(object):
self
.
func
=
func
self
.
args
=
args
self
.
keywords
=
keywords
__init__
.
__text_signature__
=
'($self, func, /, *args, **keywords)'
def
__repr__
(
self
):
args
=
", "
.
join
(
map
(
repr
,
self
.
args
))
...
...
Lib/inspect.py
View file @
d53cf99d
...
...
@@ -2121,7 +2121,7 @@ def _signature_from_builtin(cls, func, skip_bound_arg=True):
return
_signature_fromstr
(
cls
,
func
,
s
,
skip_bound_arg
)
def
_signature_from_function
(
cls
,
func
):
def
_signature_from_function
(
cls
,
func
,
skip_bound_arg
=
True
):
"""Private helper: constructs Signature for the given python function."""
is_duck_function
=
False
...
...
@@ -2133,6 +2133,10 @@ def _signature_from_function(cls, func):
# of pure function:
raise
TypeError
(
'{!r} is not a Python function'
.
format
(
func
))
s
=
getattr
(
func
,
"__text_signature__"
,
None
)
if
s
:
return
_signature_fromstr
(
cls
,
func
,
s
,
skip_bound_arg
)
Parameter
=
cls
.
_parameter_cls
# Parameter information.
...
...
@@ -2301,7 +2305,8 @@ def _signature_from_callable(obj, *,
if
isfunction
(
obj
)
or
_signature_is_functionlike
(
obj
):
# If it's a pure Python function, or an object that is duck type
# of a Python function (Cython functions, for instance), then:
return
_signature_from_function
(
sigcls
,
obj
)
return
_signature_from_function
(
sigcls
,
obj
,
skip_bound_arg
=
skip_bound_arg
)
if
_signature_is_builtin
(
obj
):
return
_signature_from_builtin
(
sigcls
,
obj
,
...
...
Lib/multiprocessing/managers.py
View file @
d53cf99d
...
...
@@ -419,6 +419,7 @@ class Server(object):
self
.
incref
(
c
,
ident
)
return
ident
,
tuple
(
exposed
)
create
.
__text_signature__
=
'($self, c, typeid, /, *args, **kwds)'
def
get_methods
(
self
,
c
,
token
):
'''
...
...
@@ -1309,6 +1310,7 @@ if HAS_SHMEM:
if
hasattr
(
self
.
registry
[
typeid
][
-
1
],
"_shared_memory_proxy"
):
kwargs
[
'shared_memory_context'
]
=
self
.
shared_memory_context
return
Server
.
create
(
*
args
,
**
kwargs
)
create
.
__text_signature__
=
'($self, c, typeid, /, *args, **kwargs)'
def
shutdown
(
self
,
c
):
"Call unlink() on all tracked shared memory, terminate the Server."
...
...
Lib/profile.py
View file @
d53cf99d
...
...
@@ -447,6 +447,7 @@ class Profile:
return
func
(
*
args
,
**
kw
)
finally
:
sys
.
setprofile
(
None
)
runcall
.
__text_signature__
=
'($self, func, /, *args, **kw)'
#******************************************************************
...
...
Lib/test/test_inspect.py
View file @
d53cf99d
...
...
@@ -3782,6 +3782,17 @@ class TestSignatureDefinitions(unittest.TestCase):
with
self
.
subTest
(
builtin
=
name
):
self
.
assertIsNone
(
obj
.
__text_signature__
)
def
test_python_function_override_signature
(
self
):
def
func
(
*
args
,
**
kwargs
):
pass
func
.
__text_signature__
=
'($self, a, b=1, *args, c, d=2, **kwargs)'
sig
=
inspect
.
signature
(
func
)
self
.
assertIsNotNone
(
sig
)
self
.
assertEqual
(
str
(
sig
),
'(self, /, a, b=1, *args, c, d=2, **kwargs)'
)
func
.
__text_signature__
=
'($self, a, b=1, /, *args, c, d=2, **kwargs)'
sig
=
inspect
.
signature
(
func
)
self
.
assertEqual
(
str
(
sig
),
'(self, a, b=1, /, *args, c, d=2, **kwargs)'
)
class
NTimesUnwrappable
:
def
__init__
(
self
,
n
):
...
...
Lib/trace.py
View file @
d53cf99d
...
...
@@ -476,6 +476,7 @@ class Trace:
if
not
self
.
donothing
:
sys
.
settrace
(
None
)
return
result
runfunc
.
__text_signature__
=
'($self, func, /, *args, **kw)'
def
file_module_function_of
(
self
,
frame
):
code
=
frame
.
f_code
...
...
Lib/unittest/case.py
View file @
d53cf99d
...
...
@@ -102,6 +102,7 @@ def addModuleCleanup(*args, **kwargs):
args
=
tuple
(
args
)
_module_cleanups
.
append
((
function
,
args
,
kwargs
))
addModuleCleanup
.
__text_signature__
=
'(function, /, *args, **kwargs)'
def
doModuleCleanups
():
...
...
@@ -498,8 +499,8 @@ class TestCase(object):
args
=
tuple
(
args
)
self
.
_cleanups
.
append
((
function
,
args
,
kwargs
))
addCleanup
.
__text_signature__
=
'($self, function, /, *args, **kwargs)'
@
classmethod
def
addClassCleanup
(
*
args
,
**
kwargs
):
"""Same as addCleanup, except the cleanup items are called even if
setUpClass fails (unlike tearDownClass)."""
...
...
@@ -514,6 +515,8 @@ class TestCase(object):
args
=
tuple
(
args
)
cls
.
_class_cleanups
.
append
((
function
,
args
,
kwargs
))
addClassCleanup
.
__text_signature__
=
'($cls, function, /, *args, **kwargs)'
addClassCleanup
=
classmethod
(
addClassCleanup
)
def
setUp
(
self
):
"Hook method for setting up the test fixture before exercising it."
...
...
Lib/weakref.py
View file @
d53cf99d
...
...
@@ -569,6 +569,7 @@ class finalize:
info
.
index
=
next
(
self
.
_index_iter
)
self
.
_registry
[
self
]
=
info
finalize
.
_dirty
=
True
__init__
.
__text_signature__
=
'($self, obj, func, /, *args, **kwargs)'
def
__call__
(
self
,
_
=
None
):
"""If alive then mark as dead and return func(*args, **kwargs);
...
...
Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst
0 → 100644
View file @
d53cf99d
The signature of Python functions can now be overridden by specifying the
``__text_signature__`` attribute.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment