【问题标题】:Should I have a separate imports file in Python? What is best practice? [closed]我应该在 Python 中有一个单独的导入文件吗?什么是最佳实践? [关闭]
【发布时间】:2020-09-27 04:04:02
【问题描述】:
main.py:
import sys
import os
import datetime
import numpy
from util import *

util.py:
import sys
import os
import logging
  1. main.py 中是否需要“import sys”和“import os”?

  2. 如果我在 main.py 和 util.py 中有“import sys”和“import os”,脚本会加载两次模块吗?

如果我创建一个单独的 myimports.py 文件,其中包含两个文件的所有导入,并在 main.py 和 util.py 中指定:

from myimports import *
  1. 每个文件都必须导入它不需要的模块吗?

  2. 我应该只保留各自的导入,而不是使用单独的 myimports.py 文件吗?

  3. 如果我只需要来自 sys 的路径,如果我使用,脚本会加载更快还是占用更少的内存:

    从系统导入路径#?

【问题讨论】:

    标签: python python-3.x import python-import


    【解决方案1】:
    1. 很难回答,取决于它是否在main.py 代码中使用

    2. 不,python 导入系统缓存评估的模块。导入后,任何请求相同模块的导入语句都将从全局注册表中返回它。这有起有落

    3. 如果我理解正确的话——这通常是一种不好的做法(在编写库或迁移具有复杂向后兼容性的代码时会有一些例外)。您应该将每个模块中的导入视为此模块依赖项的提示——就像函数中的参数一样。它们更清晰、更明确——更容易阅读和理解你的代码。这是您应该首先考虑的主要(如果不是唯一)考虑因素

    4. 在使用导入功能的模块中保留导入。导入包装器是一个相当奇怪的想法——它可能在极少数情况下有一些用处,但在正常的日常开发中它会减少true code quality

    5. 没有区别,一旦您从任何地方的sys(或任何其他模块)请求任何内容,整个sys 仍将被评估并放入模块注册表。但通常显式导入确实是一件好事——from sys import path 暗示你的模块依赖于Path。像import sys 这样的东西传达“我非常依赖sys 模块,因此一次导入所有内容更容易”。在第一种情况下,读者期望摆弄PYTHONPATH 的典型工作,在后面的工作中——硬编码系统级“元编程”。

      这样做的副作用 - 由于模块是作为整体导入和缓存的,在此导入完成后,任何其他模块中来自 sys 的任何导入都将很快(直到请求强制重新加载或手动更改注册表)

    【讨论】:

    • 1. “from util import *”不会重复sys和os的导入吗? -附言。我赞成你的回答,但我没有因果报应。
    • 无论您如何导入以及从何处导入 - 单个模块都将被评估一次。例如,一旦您导入了sys,任何其他调用import sysfrom sys import pathfrom sys import * 的代码 - 所有这些都将使用缓存版本。顺便说一句,所有这些显式导入只是命名空间处理,没有别的
    【解决方案2】:

    这里有一些你可能会觉得有用的东西。抱歉,我没有您所有问题的答案。

    我做了这个python文件目录。

    python_files
                \main.py
                \my_imports.py
    

    在 my_imports.py 中

    # module to get current time    
    from datetime import datetime
    
    current_time = datetime.now()
    

    在 main.py 中

    # import my_imports file from the same directory    
    import my_imports as my_imports 
    
    # use my_imports local name to access current_time and then format it. 
    current_time = my_imports.current_time.strftime("%H:%M:%S")
    
    # now print to console
    print("Current Time =", current_time)
    

    现在运行 main.py,它会将当前时间打印到控制台。希望这个技巧能为您提供解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2010-09-07
      • 2010-09-08
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多