gpt4 book ai didi

python - 如何组合两个函数,其外部函数为内部函数提供参数

转载 作者:太空狗 更新时间:2023-10-29 17:49:13 24 4
gpt4 key购买 nike

我有两个类似的代码需要解析,但我不确定完成此操作的最 pythonic 方法。

假设我有两个相似的“代码”

secret_code_1 = 'asdf|qwer-sdfg-wert$$otherthing'
secret_code_2 = 'qwersdfg-qw|er$$otherthing'

两个代码都以 $$otherthing 结尾,并包含一些由 - 分隔的值

起初我想到了使用functools.wrap来将一些通用逻辑与特定于每种类型代码的逻辑分开,像这样:

from functools import wraps

def parse_secret(f):
@wraps(f)
def wrapper(code, *args):
_code = code.split('$$')[0]
return f(code, *_code.split('-'))
return wrapper

@parse_secret
def parse_code_1b(code, a, b, c):
a = a.split('|')[0]
return (a,b,c)

@parse_secret
def parse_code_2b(code, a, b):
b = b.split('|')[1]
return (a,b)

然而,这样做会使您混淆实际上应该将哪些参数传递给 parse_code_* 函数,即

parse_code_1b(secret_code_1)
parse_code_2b(secret_code_2)

因此,为了使函数的形式参数更易于推理,我将逻辑更改为如下所示:

def _parse_secret(parse_func, code):
_code = code.split('$$')[0]
return parse_func(code, *_code.split('-'))

def _parse_code_1(code, a, b, c):
"""
a, b, and c are descriptive parameters that explain
the different components in the secret code

returns a tuple of the decoded parts
"""
a = a.split('|')[0]
return (a,b,c)

def _parse_code_2(code, a, b):
"""
a and b are descriptive parameters that explain
the different components in the secret code

returns a tuple of the decoded parts
"""
b = b.split('|')[1]
return (a,b)

def parse_code_1(code):
return _parse_secret(_parse_code_1, code)

def parse_code_2(code):
return _parse_secret(_parse_code_2, code)

现在更容易推断您传递给函数的内容:

parse_code_1(secret_code_1)
parse_code_2(secret_code_2)

但是这段代码要冗长得多。

有更好的方法吗?使用类的面向对象方法在这里更有意义吗?

repl.it example

最佳答案

repl.it example

函数式方法更简洁,更有意义。

我们可以从表达概念开始pure functions ,最容易组合的形式。

剥离 $$otherthing 并拆分值:

parse_secret = lambda code: code.split('$$')[0].split('-')

取其中一个内在值:

take = lambda value, index: value.split('|')[index]

将其中一个值替换为其内部值:

parse_code = lambda values, p, q: \
[take(v, q) if p == i else v for (i, v) in enumerate(values)]

这两种类型的代码有 3 个不同之处:

  • 值的数量
  • 解析“内部”值的位置
  • 要采取的“内在”值(value)观的位置

我们可以通过描述这些差异来组合解析函数。拆分值保持打包,以便更容易组合。

compose = lambda length, p, q: \
lambda code: parse_code(parse_secret(code)[:length], p, q)

parse_code_1 = compose(3, 0, 0)
parse_code_2 = compose(2, 1, 1)

并使用组合函数:

secret_code_1 = 'asdf|qwer-sdfg-wert$$otherthing'
secret_code_2 = 'qwersdfg-qw|er$$otherthing'
results = [parse_code_1(secret_code_1), parse_code_2(secret_code_2)]
print(results)

关于python - 如何组合两个函数,其外部函数为内部函数提供参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41369419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com