Saving default argument values ​​in method chain

If I need to wrap an existing method, say wrapee () from a new method, say wrapper (), and wrapee () provides default values ​​for some arguments, how do I preserve my semantics without introducing unnecessary dependencies and maintenance? Let's say the goal is to be able to use wrapper () instead of wrapee () without changing the client code. For example, if wrapee () is defined as:

def wrapee(param1, param2="Some Value"):
  # Do something

Then one of the ways to determine the shell () is:

def wrapper(param1, param2="Some Value"):
  # Do something
  wrapee(param1, param2)
  # Do something else.

However, wrapper () should make assumptions about the default value for param2, which I don't like. If I have control over wrapee (), I would define it like this:

def wrapee(param1, param2=None):
  param2 = param2 or "Some Value"
  # Do something

Then wrapper () will change to:

def wrapper(param1, param2=None):
  # Do something
  wrapee(param1, param2)
  # Do something else.

, wrapee(), wrapper()? , , , dict , None, , .

Update:

, , :

def wrapper(param1, *args, **argv):
  # Do something
  wrapee(param1, *args, **argv)
  # Do something else.

:

wrapper('test1')
wrapper('test1', 'test2')
wrapper('test1', param2='test2')
wrapper(param2='test2', param1='test1')
+3
4

Python.

>>> def wrapper(param1, *stuff, **kargs):
...  print(param1)
...  print(stuff)
...  print(args)
...
>>> wrapper(3, 4, 5, foo=2)
3
(4, 5)
{'foo': 2}

:

wrapee(param1, *stuff, **kargs)

*stuff - , **kargs - .

+3

, , , , - , , , - . , , , :

from inspect import getargspec

method_signature = getargspec(method)
param_names = method_signature[0]
default_values = method_signature[3]
params = []

# If any of method parameters has default values, we need
# to know the index of the first one that does.
param_with_default_loc = -1
if default_values is not None and len(default_values) > 0:
    param_slice_index = len(default_values) * -1
    param_with_default = param_names[param_slice_index:][0]
    param_with_default_loc = param_names.index(param_with_default)

param_names, dict, wrappee. a >= param_with_default_loc , default_values ​​ - param_with_default_loc.

- sesne?

, , -, .

+3
def wrapper(param1, param2=None):
    if param2:
        wrapee(param1, param2)
    else:
        wrapee(param1)
0

, ?

#!/usr/bin/python

from functools import wraps
def my_decorator(f):
    @wraps(f)
    def wrapper(*args, **kwds):
        print 'Calling decorated function'
        return f(*args, **kwds)
    return wrapper


def f1(x, y):
  print x, y

def f2(x, y="ok"):
  print x, y

my_decorator(f1)(1,2)
my_decorator(f2)(1,2)
my_decorator(f2)(1)

adapted from http: //koala/doc/python2.6-doc/html/library/functools.html#module-functools

0
source

Source: https://habr.com/ru/post/1729504/


All Articles