Skip to content

Commit 881b537

Browse files
committed
-
1 parent a06e05f commit 881b537

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

source_py3/python_toolbox/monkeypatching_tools.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
'''Tools for monkeypatching.'''
55

66
import sys
7+
import collections
78
import inspect
89
import types
910

@@ -90,23 +91,26 @@ def decorator(function):
9091
def change_defaults(function, new_defaults={}):
9192
def change_defaults_(function_, new_defaults_):
9293
signature = inspect.Signature.from_function(function_)
93-
defaults = list(function_.__defaults__)
94+
defaults = list(function_.__defaults__ or ())
9495
defaultful_parameters = dict_tools.filter_items(
9596
signature.parameters,
96-
lambda name, parameter: parameter.default != inspect._empty
97+
lambda name, parameter: parameter.default != inspect._empty,
98+
force_dict_type=collections.OrderedDict
9799
)
98-
for i, (name, parameter) in enumerate(defaultful_parameters):
99-
if name in new_defaults_:
100-
defaults[i] = new_defaults[name]
100+
for i, parameter_name in enumerate(defaultful_parameters):
101+
if parameter_name in new_defaults_:
102+
defaults[i] = new_defaults_[parameter_name]
103+
104+
function_.__defaults__ = tuple(defaults)
101105

102106
if not callable(function) and new_defaults == {}:
103107
# Decorator mode:
104-
actual_new_defaults = function
108+
actual_new_defaults = new_defaults or function or {}
105109
return lambda function_: change_defaults_(function_,
106110
actual_new_defaults)
107111
else:
108112
# Normal usage mode:
109-
change_defaults(function, new_defaults)
113+
change_defaults_(function, new_defaults)
110114

111115

112116

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Copyright 2009-2014 Ram Rachum.
2+
# This program is distributed under the MIT license.
3+
4+
from python_toolbox import cute_testing
5+
6+
from python_toolbox import monkeypatching_tools
7+
8+
9+
def test():
10+
def f1(alpha, beta, *args, gamma=10, delta=20, **kwargs):
11+
return (alpha, beta, args, gamma, delta, kwargs)
12+
assert f1(1, 2) == (1, 2, (), 10, 20, {})
13+
14+
monkeypatching_tools.change_defaults(f1, {'delta': 200,})
15+
assert f1(1, 2) == (1, 2, (), 10, 200, {})
16+
17+
@monkeypatching_tools.change_defaults({'gamma': 100})
18+
def f2(alpha, beta, *args, gamma=10, delta=20, **kwargs):
19+
return (alpha, beta, args, gamma, delta, kwargs)
20+
assert f2(1, 2) == (1, 2, (), 100, 400, {})
21+
22+
@monkeypatching_tools.change_defaults(new_defaults={'gamma': 1000})
23+
def f3(alpha, beta, *args, gamma=10, delta=20, **kwargs):
24+
return (alpha, beta, args, gamma, delta, kwargs)
25+
assert f3(1, 2) == (1, 2, (), 1000, 400, {})
26+

source_py3/test_python_toolbox/test_monkeypatching_tools.py renamed to source_py3/test_python_toolbox/test_monkeypatching_tools/test_monkeypatch.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
# Copyright 2009-2014 Ram Rachum.
22
# This program is distributed under the MIT license.
33

4-
'''Testing module for `python_toolbox.monkeypatching_tools`.'''
5-
64

75
import sys
86
import uuid

0 commit comments

Comments
 (0)