gpt4 book ai didi

python - 让 PyC​​harm 将 Python 函数中的代码提取到嵌套函数中

转载 作者:行者123 更新时间:2023-12-03 21:48:49 25 4
gpt4 key购买 nike

我让 PyC​​harm 2017.3 将一个顶级函数中的一些代码提取到另一个顶级函数中,效果很好。

但是,有时我不想将提取的函数放在顶层,而是应该将其变成嵌套在现有函数中的函数。基本原理是重用仅在函数内部使用但多次使用的代码。我认为这个“子功能”理想情况下不应在原始功能之外访问。

我该怎么做?我在重构对话框中没有看到任何选项。

例子

a) 原始代码:

def foo():
a = ''
if a == '':
b = 'empty'
else:
b = 'not empty'
return b

b) 提取的作用:

def foo():
a = ''
b = bar(a)
return b


def bar(a):
if a == '':
b = 'empty'
else:
b = 'not empty'
return b

c) 我想要的东西:

def foo():
def bar():
if a == '':
b = 'empty'
else:
b = 'not empty'
return b

a = ''
b = bar(a)
return b

我知道 barb 会隐藏 foob 除非它在过程。我还考虑过不返回或请求 b 并只是在 bar 中修改它来完全接受阴影。

如果出于任何原因我想要的不是一件好事,也请提示我。

最佳答案

保持函数边界隔离被认为是一种很好的做法:获取数据作为参数,并将数据作为返回值,尽可能减少副作用。也就是说,在某些特殊情况下您会违反此规则;使用closures时很多.闭包在 Python 中不像在 Javascript 中那样惯用 - 我个人认为这很好,但很多人不同意。

有一个地方是闭包在 Python 中绝对惯用的:装饰器。对于使用闭包以避免使用全局变量并提供某种形式的数据隐藏的其他情况,Python 中还有其他选择。尽管有些人提倡在只有一个方法时使用闭包而不是类,一个简单的函数与 functools.partial 相结合。可以更好。

这是我对为什么 Pycharm 中没有这样的功能的猜测:我们几乎从不在 Python 中这样做,相反我们倾向于将函数签名保持为 foo(x) 即使我们可以得到x 来自封闭范围。该死,在 Python 中,我们的方法显式接收 self,而大多数语言都有隐式 this。如果您以这种方式编写代码,那么 Pycharm 已经完成了重构时所需的一切:它在您剪切和粘贴时修复了缩进。

如果你发现自己经常进行这种重构,我猜你来自一种闭包更惯用的语言,如 Javascript 或 Lisp。

所以我的观点是:Pycharm 中不存在这种“嵌套到全局”或“全局到嵌套”函数重构功能,因为依赖封闭范围的嵌套函数在 Python 中不是惯用的,除非是闭包——甚至闭包也不装饰器之外的惯用语。

如果您足够关心,请前往 their issue tracker 填写功能请求或投票给一些相关的票,例如 #PY-12802#PY-2701 - 如您所见,可能由于上述原因,这些并没有引起太多关注。

关于python - 让 PyC​​harm 将 Python 函数中的代码提取到嵌套函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633807/

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