1

假设我有一个字符串列表:

names = ['Alice', 'Bob', 'Charlie']

我想使用一些函数将它们与特定的小写字符串进行比较foo

map(lambda name: foo('carol', str.lower(name)), names)

有没有办法改变foo接受在bar评估 foo 之前评估的可调用对象?所以我可以写这样的东西:

map(partial(foo, 'carol', str.lower), names)  # foo sees the name in lowercase
4

2 回答 2

3

这就是他们制作装饰器的目的!看看一个装饰器,它将所有参数都小写并传递给某个函数:

 def lower_args(func):
   @functools.wraps(func)
   def _wrapper(*args, **kwargs):
     l_args = map(str.lower, args)
     l_kwargs = {(name, str.lower(value)) for (name, value) in kwargs}

     return func(*l_args, **l_kwargs)
   return _wrapper

像这样使用:

@lower_args
def foo(a, b, c):
  #and your code goes here

做你想做的事,稍微改变语法

def to_lower(mod_func):
  def deco(func):
    @functools.wraps(func)
    def _wrapper(*args, **kwargs):
      return func(*map(mod_func, args), {(k, mod_func(v)) for (k,v) in kwargs})
    return _wrapper
  return deco

像这样使用:

@to_lower(my_function)
def foo(a, b, c):
  #your code goes here
于 2014-05-07T15:46:00.133 回答
2

这样做的pythonic方法就是使用生成器表达式。你使用的地方names,而不是:

(name.lower() for name in names)

它将在容器被迭代(“懒惰”)时进行评估,如您所愿。

于 2014-05-07T15:46:21.287 回答