Python 3 中函数多态性的装饰器方法
Decorator approach to function polymorphism in Python 3
我有一个函数 f
,它接收参数 i
、A
和 B
。 i
是计数器,A
和 B
是列表或常量。该函数仅添加 A
和 B
的第 i 个元素(如果它们是列表)。这是我在 Python 3.
中写的内容
def const_or_list(i, ls):
if isinstance(ls, list):
return ls[i]
else:
return ls
def f(i, A, B):
_A = const_or_list(i, A)
_B = const_or_list(i, B)
return _A + _B
M = [1, 2, 3]
N = 11
P = [5, 6, 7]
print(f(1, M, N)) # gives 13
print(f(1, M, P)) # gives 8
您会注意到 const_or_list()
函数在两个(但不是全部)输入参数上被调用。是否有装饰器(可能更多Pythonic)方法来实现我上面所做的?
你可以这样做:
def const_or_list(i, ls):
if isinstance(ls, list):
return ls[i]
else:
return ls
def f(*args):
i_ip = args[0]
result_list = []
for i in range(1, len(args)):
result_list.append(const_or_list(i_ip, args[i]))
return sum(result_list)
M = [1, 2, 3]
N = 11
P = [5, 6, 7]
print(f(1, M, N)) # gives 13
print(f(1, M, P)) # gives 8
我认为在这种情况下更多的 pythonic 没有装饰器。我会去掉 isinstance
,改用 try/except 并去掉中间变量:
代码:
def const_or_list(i, ls):
try:
return ls[i]
except TypeError:
return ls
def f(i, a, b):
return const_or_list(i, a) + const_or_list(i, b)
测试代码:
M = [1, 2, 3]
N = 11
P = [5, 6, 7]
Q = (5, 6, 7)
print(f(1, M, N)) # gives 13
print(f(1, M, P)) # gives 8
print(f(1, M, Q)) # gives 8
结果:
13
8
8
但是我真的需要一个装饰器:
很好,但它是 很多 更多代码...
def make_const_or_list(param_num):
def decorator(function):
def wrapper(*args, **kwargs):
args = list(args)
args[param_num] = const_or_list(args[0], args[param_num])
return function(*args, **kwargs)
return wrapper
return decorator
@make_const_or_list(1)
@make_const_or_list(2)
def f(i, a, b):
return a + b
我有一个函数 f
,它接收参数 i
、A
和 B
。 i
是计数器,A
和 B
是列表或常量。该函数仅添加 A
和 B
的第 i 个元素(如果它们是列表)。这是我在 Python 3.
def const_or_list(i, ls):
if isinstance(ls, list):
return ls[i]
else:
return ls
def f(i, A, B):
_A = const_or_list(i, A)
_B = const_or_list(i, B)
return _A + _B
M = [1, 2, 3]
N = 11
P = [5, 6, 7]
print(f(1, M, N)) # gives 13
print(f(1, M, P)) # gives 8
您会注意到 const_or_list()
函数在两个(但不是全部)输入参数上被调用。是否有装饰器(可能更多Pythonic)方法来实现我上面所做的?
你可以这样做:
def const_or_list(i, ls):
if isinstance(ls, list):
return ls[i]
else:
return ls
def f(*args):
i_ip = args[0]
result_list = []
for i in range(1, len(args)):
result_list.append(const_or_list(i_ip, args[i]))
return sum(result_list)
M = [1, 2, 3]
N = 11
P = [5, 6, 7]
print(f(1, M, N)) # gives 13
print(f(1, M, P)) # gives 8
我认为在这种情况下更多的 pythonic 没有装饰器。我会去掉 isinstance
,改用 try/except 并去掉中间变量:
代码:
def const_or_list(i, ls):
try:
return ls[i]
except TypeError:
return ls
def f(i, a, b):
return const_or_list(i, a) + const_or_list(i, b)
测试代码:
M = [1, 2, 3]
N = 11
P = [5, 6, 7]
Q = (5, 6, 7)
print(f(1, M, N)) # gives 13
print(f(1, M, P)) # gives 8
print(f(1, M, Q)) # gives 8
结果:
13
8
8
但是我真的需要一个装饰器:
很好,但它是 很多 更多代码...
def make_const_or_list(param_num):
def decorator(function):
def wrapper(*args, **kwargs):
args = list(args)
args[param_num] = const_or_list(args[0], args[param_num])
return function(*args, **kwargs)
return wrapper
return decorator
@make_const_or_list(1)
@make_const_or_list(2)
def f(i, a, b):
return a + b