[英]How to emulate a C-style function pointer with Python functions
假设当在较大的字符串中找到子字符串的实例时,我有一个硬编码的函数使子字符串小写,例如:
def process_record(header, needle, pattern):
sequence = needle
for idx in [m.start() for m in re.finditer(pattern, needle)]:
offset = idx + len(pattern)
sequence = sequence[:idx] + needle[idx:offset].lower() + sequence[offset:]
sys.stdout.write('%s\n%s\n' % (header, sequence))
这工作正常,例如:
>>> process_record('>foo', 'ABCDEF', 'BCD')
>foo
AbcdEF
我想做的就是对此进行概括,以传入一个字符串函数(在这种情况下为lower
,但它可以是原始类型或类的任何函数)作为参数。 就像是:
def process_record(header, needle, pattern, fn):
sequence = needle
for idx in [m.start() for m in re.finditer(pattern, needle)]:
offset = idx + len(pattern)
sequence = sequence[:idx] + needle[idx:offset].fn() + sequence[offset:]
sys.stdout.write('%s\n%s\n' % (header, sequence))
这是行不通的(这就是为什么我要问这个问题),但是希望这可以证明这个想法,试图以一种易于理解的方式概括该函数的功能。
我想的一个选择是编写一个辅助函数,该函数包装stringInstance.lower()
并传递字符串的副本,这效率低下且笨拙。 我希望Python专家知道一种更优雅的方法。
例如,对于C语言,我会将要运行的函数的指针作为参数传递给process_record()
,然后直接在目标变量上运行函数指针。
在Python中使用字符串基元函数(或在基元或其他类上类似)时执行相同操作的语法是什么?
通常,使用这种方法:
def call_fn(arg, fn):
return fn(arg)
call_fn('FOO', str.lower) # 'foo'
Python中方法的定义始终以self
作为第一个参数开始。 通过将方法作为类的属性来调用,可以强制使用该参数的值。
您的示例有点复杂,因此我将其分为两个不同的问题:
1)如何提供函数作为参数?
函数是与其他所有对象一样的对象,可以按预期传递,例如:
def apply(val, func):
# e.g. ("X", string.lower) -> "x"
# ("X", lambda x: x * 2) -> "XX"
return func(val)
在您的示例中,您可能会做
def process_record(..., func):
...
sequence = ... func(needle[idx:offset]) ...
...
我不推荐的另一种方法是
def apply_by_name(val, method_name):
# e.g. ("X", "lower") -> "x"
return getattr(val, method_name)()
2)如何将效果应用于字符串中的每个正则表达式匹配项?
为此,我建议使用内置的“ sub”函数,该函数同时包含字符串和函数。
>>> re.sub('[aeiou]', '!', 'the quick brown fox')
'th! q!!ck br!wn f!x'
def foo(match):
v = match.group()
if v == 'i': return '!!!!!!!'
elif v in 'eo': return v * 2
else: return v.upper()
>>> re.sub('[aeiou]', foo, 'the quick brown fox')
'thee qU!!!!!!!ck broown foox'
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.