下面是函数 foo 的基本逻辑:
def foo(item_lst):
val_in_foo_scope = 1
for item in item_lst:
# some logic to deal with item
# val_in_foo_scope used
pass
return 0
循环中的逻辑可以很复杂,为了让代码更清晰,我想把逻辑拆分成一个单独的函数。
有内部函数:
def foo(item_lst):
val_in_foo_scope = 1
def some_logic(item):
# val_in_foo_scope used
pass
for item in item_lst:
some_logic(item)
return 0
有外部函数:
def some_logic(item, val):
# val used
pass
def foo(item_lst):
val_in_foo_scope = 1
for item in item_lst:
some_logic(item, val_in_foo_scope)
return 0
内函数版本
- val_in_foo_scope 可以直接使用 -- good
- 我们很容易知道some_logic与foo相关,实际上只用在foo函数中 -- good强>
- 每次函数 foo 被调用时,都会创建一个新的内部函数 -- 不太好
外函数版本
- val_in_foo_scope 不能直接使用 -- 不太好
- 我们无法直接看到 some_logic 和 foo 之间的相关性 -- 不太好
- some_logic 将创建一次 -- 好
- 全局命名空间会有这么多函数 -- 不太好
那么,哪种方案更好,或者还有其他方案吗?
可以考虑以下因素或您想到的任何其他因素:
- 是否使用val_in_foo_scope
- 是否可以忽略每次创建内部函数的时间成本
最佳答案
使用lambda如果它是一个简单的函数。
如果它很复杂并且您不想使其“公开”,请使用内部函数。
如果您想将其标记为隐藏并使用实例成员,请使用“private”方法。
如果你想让它“公开”并使用实例的成员,请使用一个方法。
如果它使用类成员,则使用类方法。
如果通用函数足以被其他类/函数使用,最后使用全局函数。
关于python - 在python函数中使用inner function让逻辑清晰好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48063382/