Skip to content

Instantly share code, notes, and snippets.

@vrthra
Created September 5, 2021 10:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vrthra/3945df5d9a3a8b257367585b45cc3b18 to your computer and use it in GitHub Desktop.
Save vrthra/3945df5d9a3a8b257367585b45cc3b18 to your computer and use it in GitHub Desktop.
Fixing Python wtf -- parameter defaults
import functools
import inspect
def fix_params(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
original_defaults = func.__defaults__
new_defaults = []
for val in func.__defaults__:
if val == []:
new_defaults.append([])
elif val == {}:
new_defaults.append({})
elif callable(val):
sig = inspect.signature(val)
if sig.parameters == {}:
new_defaults.append(val())
else:
new_defaults.append(val)
else:
new_defaults.append(val)
func.__defaults__ = tuple(new_defaults)
rval = func(*args, **kwargs)
func.__defaults__ = original_defaults
return rval
return wrapper
VAL = 0
import datetime
@fix_params
def do_something(a, b, inputs=[], my_opts={}, my_f = lambda: datetime.datetime.now()):
global VAL
VAL += 1
inputs.append(1)
my_opts[VAL] = VAL
print(inputs)
print(my_opts)
print(my_f)
return inputs
def main():
do_something(0, 0)
do_something(1,1)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment