Python 有没有一种方法可以将函数转换为接受在函数之前计算的可调用函数?

Python 有没有一种方法可以将函数转换为接受在函数之前计算的可调用函数?,python,partial,functools,Python,Partial,Functools,假设我有一个字符串列表: names = ['Alice', 'Bob', 'Charlie'] 我想用一些函数foo将它们与一个特定的小写字符串进行比较: map(lambda name: foo('carol', str.lower(name)), names) 有没有办法改变foo以接受一个可调用的条,该条在计算foo之前进行计算?所以我可以这样写: map(partial(foo, 'carol', str.lower), names) # foo sees the name in

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

names = ['Alice', 'Bob', 'Charlie']
我想用一些函数
foo
将它们与一个特定的小写字符串进行比较:

map(lambda name: foo('carol', str.lower(name)), names)
有没有办法改变
foo
以接受一个可调用的
,该条在计算foo之前进行计算?所以我可以这样写:

map(partial(foo, 'carol', str.lower), names)  # foo sees the name in lowercase
@lower_args
def foo(a, b, c):
  #and your code goes here

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

 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
这样使用:

map(partial(foo, 'carol', str.lower), names)  # foo sees the name in lowercase
@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

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

 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
这样使用:

map(partial(foo, 'carol', str.lower), names)  # foo sees the name in lowercase
@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

pythonic的方法就是使用生成器表达式。在使用
名称的地方,请改为:

(name.lower() for name in names)

它将根据您的需要在容器被迭代(“延迟”)时进行评估

python方法就是使用生成器表达式。在使用
名称的地方,请改为:

(name.lower() for name in names)

它将根据您的需要在容器被迭代(“延迟”)时进行评估

您是否尝试过在地图中输入我想要的名称(str.lower,names)
?我可能遗漏了什么。我不确定你的帖子是否让人困惑,或者我只是个傻瓜……也许我的帖子让人困惑。我真的不知道我要的是什么这是一个非常简单的示例,我想做的是准备一个部分,其中包含我无法编辑的函数(例如从其他模块导入的函数),这些函数适合某个可调用的地方。该可调用函数将在调用函数之前处理该值。您的帖子令人困惑,因为您正在演示如何使用一些高级且不必要的python机制(lambda、map和partial)来完成一件非常简单的事情。您是否尝试过在map(str.lower、names)中使用
name\u I\u want?我可能遗漏了什么。我不确定你的帖子是否让人困惑,或者我只是个傻瓜……也许我的帖子让人困惑。我真的不知道我要的是什么这是一个非常简单的示例,我想做的是准备一个部分,其中包含我无法编辑的函数(例如从其他模块导入的函数),这些函数适合某个可调用的地方。该可调用函数将在调用函数之前处理该值。您的帖子令人困惑,因为您正在演示如何使用一些高级且不必要的python机制(lambda、map和partial)完成一件非常简单的事情。这是实现映射函数组合的python方法。这是实现映射函数组合的python方法。