在 Python 中在操作代码中间定义一个函数是不好的做法吗? [关闭]

Posted

技术标签:

【中文标题】在 Python 中在操作代码中间定义一个函数是不好的做法吗? [关闭]【英文标题】:Is it bad practice in Python to define a function in the middle of operational code? [closed] 【发布时间】:2013-11-27 02:20:18 【问题描述】:

我从a similar question on imports 了解到,不应将“操作代码”和import 混用(它们应该在顶部)。

在“操作代码”中间定义函数的共识是什么?

我有一个例子,一个函数只在一个地方使用(它必须是一个函数)并且它的定义接近那段代码是有意义的(所有将被组合在一起)。但是,它在视觉上破坏了代码的流程。

PEP 有什么建议吗? (我没有找到任何相关的东西,而不是import

编辑:答案中的明显趋势是这不是一件好事,但与上面提到的importcase 不同,没有明确的指令(例如 PEP)

【问题讨论】:

我通常只在需要关闭某些仅在包含函数范围内可用的变量时才这样做。 投票结束,因为您可能会得到与人一样多的不同答案,而且到目前为止,除了“我认为”之外,没有任何答案引用任何来源。我对此事的看法:当我想做的事情对于 lambda 来说太复杂但又太具体而无法成为其他人可以使用的通用函数时,我会在操作代码的中间定义函数。它类似于do stuff; and more stuff; by the way, here's how you remove invalid characters for a string; remove invalid characters for all strings; do other stuff 【参考方案1】:

python 脚本或模块中的所有代码(基本上是相同的东西——不同之处在于它的使用方式)以一种或另一种方式是“操作代码”。构建脚本代码的简洁方法是在函数中包含 everything - 您将“操作代码”命名为“main()”函数中的内容 - 并且只需调用该“main”函数如果模块被用作脚本,即:

# mymoduleorscript.py
import something
from somewhere import somethingelse

def somefunc(arg1, arg2):
   # ...

def otherfunc(arga, argb):
   # ...

def main(*args):
   # "operational" code here
   return status_code # 0 if ok, anything else if error

# only call main if used as a script
if __name__ == "__main__":
     import sys
     sys.exit(main(*sys.argv[1:]))

请注意,这不是“在我看来”的答案,而是官方祝福的 OneTrueWay 做事方式。

【讨论】:

你的import sys不是违反PEP吗? @WoJ 从技术上讲是的,但是当我只需要 sys 作为主要内容时,我倾向于将其保留在那里。【参考方案2】:

除非确实有必要,否则我更喜欢将所有内容放在脚本的顶部,因为这样可以更轻松地找到它们 - 更易读 - 也更整洁。

我认为,如果您的代码要被其他人阅读,您不希望他们在想要查看功能或您的代码如何运行时感到困惑。

此外,将您的程序分解成更小的部分,尤其是对于很长很长的代码是一个好主意。当您必须处理任何一部分时,您可以快速完成。所以对我来说,顶部是声明,底部是操作代码。 :)

我不知道为什么,但我想在这里附加这个:

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
...

【讨论】:

嗯.. 为什么要投反对票?这不是元..【参考方案3】:

好吧,我不确定这是对还是错,因为我是这里的另一个新手。但是我在我的代码中实现了一些类似的东西,它将在操作代码之间导入。

代码:

import os,importlib,

l  = os.listdir(os.getcwd())
x = [m.split('.')[0] for m in l if m.endswith('.py')] #  list all the py files in the direcory.

modules = []
for mod in x: 
    modules.append(importlib.import_module(mod)) # I am importing them using a for loop

我真的不知道这就是你要找的东西。但是,如果它可以以任何方式帮助您,我会很高兴...我会将最佳编程实践的评论留给这里的向导:)

【讨论】:

他想知道是好是坏。不是如何:) 顺便说一句,你运行你的代码了吗?导入末尾多了一个逗号 @Sarvan, all the py files 是 Python 模块 ... 我在这里只给出了我的部分代码可能会导致一些错误.. 但它对我来说工作正常。当我们不知道为什么甚至我在我的回答中也发表了同样的评论时,没有什么不好的说法。 - thefourtheye 我没明白你的意思 - Oz123【参考方案4】:

我认为问题在于您的操作代码太长,这导致如果您在操作代码之前定义该函数,那么它离调用它的位置太远了。

编写很长的代码通常不是一个好主意,不仅在 Python 中。我的建议是找到一些方法将您的长段操作代码拆分为模块(函数或类)。

【讨论】:

问题?什么问题?【参考方案5】:

在我看来,将功能排除在操作代码之外是好的,原因有两个:

    它增加了程序在操作中的可读性 代码你可以只调用函数而不是填充函数 在其他表达式/语句之间。它也使程序看起来更干净。 在操作代码之间填充函数会破坏程序的结构并使代码看起来更复杂

【讨论】:

【参考方案6】:

我可以看到有时这可能与“flat is better than nested”有关。例如,

def dist(x, y):
    return abs(x - y)

for a, v in ls1:
    ls2.append(dist(a, b))

for a, v in ls1:
    def dist(x, y):
        return abs(x - y)

    ls2.append(dist(a, b))

就我个人而言,我有时会混合使用函数和操作代码。我没有看到任何针对它的特定 PEP,但仍应考虑代码组织的一般考虑。

【讨论】:

以上是关于在 Python 中在操作代码中间定义一个函数是不好的做法吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 redux 中在哪里调度多个操作?

Python中在进行赋值运算时即使两侧操作数的类型不同也不会报错?

确定一个函数在 Python 模块中是不是可用

Redux Thunk vs Redux 自定义中间件

C语言中在一个函数中可以声明另一个函数吗(不是定义)?在main里面声明也可以吗?

asp.net中在Gridview中自定义一列操作,应该怎么做?