导入内部函数是Python吗?

2024-05-19 02:55:38 发布

您现在位置:Python中文网/ 问答频道 /正文

PEP 8说:

  • Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

偶尔,我违反了8号政治公众人物。有时我会在函数中导入内容。一般来说,如果有一个只在单个函数中使用的导入,我会这样做。

有什么意见吗?

编辑(我觉得导入函数是个好主意):

主要原因:它可以使代码更清晰。

  • 在查看函数的代码时,我可能会问自己:“什么是函数/类xxx?”(函数内部使用了xxx)。如果我的所有导入都在模块的顶部,我必须查看那里以确定什么是xxx。这在使用from m import xxx时更是一个问题。在函数中看到m.xxx可能会告诉我更多。取决于m是什么:它是一个众所周知的顶级模块/包(import m)?还是子模块/包(from a.b.c import m)?
  • 在某些情况下有额外的信息(“什么是xxx?”)接近使用xxx的地方可以使函数更容易理解。

Tags: 模块andthe函数代码fromimportput
3条回答

在这方面,我有两次违反了PEP 8:

  • 循环导入:模块A导入模块B,但模块B中的某些内容需要模块A(尽管这通常表明我需要重构模块以消除循环依赖)
  • 插入一个pdb断点:import pdb; pdb.set_trace()这是一个方便的b/c,我不想把import pdb放在我可能要调试的每个模块的顶部,而且在删除断点时很容易记住删除导入。

除了这两种情况外,最好把一切放在首位。它使依赖关系更加清晰。

下面是我们使用的四个导入用例

  1. 顶端的import(以及from x import yimport x as y

  2. 导入选项。在上面。

    import settings
    if setting.something:
        import this as foo
    else:
        import that as foo
    
  3. 条件导入。与JSON、XML库等一起使用。在上面。

    try:
        import this as foo
    except ImportError:
        import that as foo
    
  4. 动态导入。到目前为止,我们只有一个例子。

    import settings
    module_stuff = {}
    module= __import__( settings.some_module, module_stuff )
    x = module_stuff['x']
    

    注意,这个动态导入不会引入代码,但是会引入复杂的 用Python编写的数据结构。这有点像一段腌制过的数据 但我们用手腌制。

    它也或多或少地位于模块的顶部


我们要做的是使代码更清晰:

  • 保持模块短。

  • 如果我的所有导入都在模块的顶部,那么我必须查看那里以确定名称是什么。如果模块很短,这很容易做到。

  • 在某些情况下,将这些额外的信息放在接近使用名称的位置可以使函数更容易理解。如果模块很短,这很容易做到。

从长远来看,我认为您会很感激将大部分导入放在文件顶部,这样您就可以通过需要导入的内容一眼看出模块有多复杂。

如果我在现有文件中添加新代码,我通常会在需要的地方进行导入,然后如果代码保持不变,我会将导入行移到文件的顶部,使其更为永久。

还有一点,我更喜欢在运行任何代码之前得到一个ImportError异常——作为一个健全性检查,所以这是在顶部导入的另一个原因。

我使用pyChecker检查未使用的模块。

相关问题 更多 >

    热门问题