Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch: py3.7
Changeset: r98582:b0ac9a40db7e
Date: 2020-01-24 13:51 +0100
http://bitbucket.org/pypy/pypy/changeset/b0ac9a40db7e/
Log: need to do argument parsing slightly differently
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -1400,11 +1400,9 @@
self.parent_w = []
self.child_w = []
-@unwrap_spec(w_before=WrappedDefault(None),
w_after_in_parent=WrappedDefault(None),
- w_after_in_child=WrappedDefault(None))
-def register_at_fork(space, __kwonly__, w_before, w_after_in_parent,
w_after_in_child):
+def register_at_fork(space, __args__):
"""
- register_at_fork(...)
+ register_at_fork(*, [before], [after_in_child], [after_in_parent])
Register callables to be called when forking a new process.
before
@@ -1417,23 +1415,39 @@
'before' callbacks are called in reverse order.
'after_in_child' and 'after_in_parent' callbacks are called in order.
"""
+ # annoying, can't express argument parsing of this nicely
+ # because cpython explicitly wants
+ # os.register_at_fork(before=None, after_in_parent=<callable>)
+ # to fail, and we can't use unwrapped None as a kwonly default
+ args_w, kwargs_w = __args__.unpack()
+ if args_w:
+ raise oefmt(space.w_TypeError,
+ "register_at_fork() takes no positional arguments")
+ w_before = kwargs_w.pop("before", None)
+ w_after_in_parent = kwargs_w.pop("after_in_parent", None)
+ w_after_in_child = kwargs_w.pop("after_in_child", None)
+ if kwargs_w:
+ for key in kwargs_w:
+ raise oefmt(space.w_TypeError,
+ "%s is an invalid keyword argument for register_at_fork()",
key)
+
registered = False
cbs = space.fromcache(ApplevelForkCallbacks)
- if not space.is_w(space.w_None, w_before):
+ if w_before is not None:
if not space.callable_w(w_before):
raise oefmt(space.w_TypeError,
"'before' must be callable, not %T",
w_before)
cbs.before_w.append(w_before)
registered = True
- if not space.is_w(space.w_None, w_after_in_parent):
+ if w_after_in_parent is not None:
if not space.callable_w(w_after_in_parent):
raise oefmt(space.w_TypeError,
"'after_in_parent' must be callable, not %T",
w_after_in_parent)
cbs.parent_w.append(w_after_in_parent)
registered = True
- if not space.is_w(space.w_None, w_after_in_child):
+ if w_after_in_child is not None:
if not space.callable_w(w_after_in_child):
raise oefmt(space.w_TypeError,
"'after_in_child' must be callable, not %T",
@@ -1442,7 +1456,7 @@
registered = True
if not registered:
raise oefmt(space.w_TypeError,
- "At least one argument is required")
+ "At least one argument is required.")
def _run_applevel_hook(space, w_callable):
diff --git a/pypy/module/posix/test/apptest_posix.py
b/pypy/module/posix/test/apptest_posix.py
--- a/pypy/module/posix/test/apptest_posix.py
+++ b/pypy/module/posix/test/apptest_posix.py
@@ -13,14 +13,15 @@
os.register_at_fork(lambda : 1)
with pytest.raises(TypeError): # not callable
os.register_at_fork(before=1)
+ with pytest.raises(TypeError): # wrong keyword
+ os.register_at_fork(a=1)
# XXX this is unfortunately a small leak! all further tests that fork
# will call these callbacks and append four ints to l
l = [1]
- os.register_at_fork(
- before=lambda: l.append(2),
- after_in_parent=lambda: l.append(5),
- after_in_child=lambda: l.append(3))
+ os.register_at_fork(before=lambda: l.append(2))
+ os.register_at_fork(after_in_parent=lambda: l.append(5))
+ os.register_at_fork(after_in_child=lambda: l.append(3))
def double_last():
l[-1] *= 2
os.register_at_fork(
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit