gpt4 book ai didi

仅在一个函数内重用代码的 Pythonic 方法

转载 作者:行者123 更新时间:2023-11-28 19:24:12 25 4
gpt4 key购买 nike

我的问题是关于在一个函数内组织多次需要的代码,而不是在其他地方。

假设以下用例:

class A(object):
def __init__(self, base):
self.base = base

def foo(self):
result = self.base + 2 # Should go to an extra function.
result = result * 4
if result > 10:
result = result + 2 # Should go to an extra function.
return result

def bar(self):
pass

foo() 中重复了 x + 2 部分,在我的项目中有 20 行代码(将值添加到另一个对象的 20 个属性) 应该被抽象。但是把那些放在哪里呢?我看到了三种方法:

(1.) 嵌套函数:

class A(object):
# ...

def foo(self):
def plus_two(value):
return value + 2

result = plus_two(self.base)
result = result * 4
if result > 10:
result = plus_two(result)
return result

# ...

这似乎是有道理的,因为它是一个非常特定的用例,只与方法内部发生的事情有关。

但是:无法测试,无法从外部访问嵌套函数进行单元测试。我真的不想将其作为 foo()部分进行测试,因为它需要测试 plus_two 的全部 两次(对于两种 if 情况)。在单元测试中,应该可以单独测试 plus_two,并且只测试它在 foo() 中的正确调用

(2.) 辅助方法:

class A(object):
# ...

def foo(self):
result = self.plus_two(self.base)
result = result * 4
if result > 10:
result = self.plus_two(result)
return result

def plus_two(self, value):
return value + 2

# ...

但是: 该方法现在并且永远不会被类中的任何其他方法使用,也不需要访问 self,因此它不应该成为那个方法类(class)。在不需要访问对象或不需要作为接口(interface)的一部分进行覆盖的类中收集函数不是 pythonic。

(3.) 模块函数:

def plus_two(value):
return value + 2

class A(object):
# ...

def foo(self):
result = plus_two(self.base)
result = result * 4
if result > 10:
result = plus_two(result)
return result

# ...

但是:这导致几个辅助函数从其非常具体的上下文中取出,换句话说,不遵循封装。虽然这在这里似乎不是问题并且可能看起来是解决方案,但在我的项目中这确实会使整个模块变得困惑,因为该功能通常与模块无关,但如前所述,非常具体到使用它的那个方法。换句话说:将它拆分到远离它的上下文的某个地方,它使代码的可读性大大降低,并且 pythonic 更少。

有没有其他方法,或者我应该选择这里显示的三种方法之一?

最佳答案

我当然希望真实的例子更复杂 :)

我会说使用嵌套函数或辅助函数。我个人会选择辅助功能,但这只是我的意见。这当然是根据我对你的描述所知道的。实际代码将为建议提供比随机示例更好的基础。

关于仅在一个函数内重用代码的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936840/

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