Skip to content

Instantly share code, notes, and snippets.

@tmr232
Created March 4, 2014 19:44
Show Gist options
  • Select an option

  • Save tmr232/9354077 to your computer and use it in GitHub Desktop.

Select an option

Save tmr232/9354077 to your computer and use it in GitHub Desktop.
Decorator to enable changing the values of default arguments in python functions.
from functools import wraps
class Default(object):
def __init__(self, name):
super(Default, self).__init__()
self.name = name
def set_defaults(defaults):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
# Backup original function defaults.
original_defaults = f.func_defaults
# Replace every `Default("...")` argument with its current value.
function_defaults = []
for default_value in f.func_defaults:
if isinstance(default_value, Default):
function_defaults.append(defaults[default_value.name])
else:
function_defaults.append(default_value)
# Set the new function defaults.
f.func_defaults = tuple(function_defaults)
return_value = f(*args, **kwargs)
# Restore original defaults (required to keep this trick working.)
f.func_defaults = original_defaults
return return_value
return wrapper
return decorator
my_defaults = dict(USER_INPUT=0)
@set_defaults(my_defaults)
def DoSomething(var_of_data, user_input=Default("USER_INPUT")):
return var_of_data, user_input
def main():
print DoSomething("This")
my_defaults["USER_INPUT"] = 1
print DoSomething("Thing")
my_defaults["USER_INPUT"] = 2
print DoSomething("Actually")
print DoSomething("Works", 3)
if __name__ == "__main__":
main()
@tmr232
Copy link
Author

tmr232 commented Mar 4, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment