繁体   English   中英

如何使用Python函数模拟C样式函数指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM