我对python很新,并且正在寻找处理项目中导入的最佳(最优选)方法。
我已经完成了清理python项目的任务,并注意到整个项目中的许多模块都有相同的包含。这是我所看到的一个例子。
档案my_main_file.py
import os
import sys
import inspect
...
import gvars
import Common
...
from Tkinter import Menu
from Tkinter import WORD
from Tkinter import END
from Tkinter import Text
...
import menus.config
文件gvars.py(也称为Tkinter)
from Tkinter import Text
from Tkinter import Tk
import Tkinter
文件Common.py(也调用gvars和os)
import gvars
import tkFileDialog
import os
来自Menus / config.py(也称为Common,gvars和Tkinter)
import Common
import gvars
import UIFunctions
import Tkinter
# Imports from Tk
from Tkinter import END
from Tkinter import Toplevel
from Tkinter import Button, Checkbutton
from Tkinter import Label
然而它依旧......正如你所看到的,这是我继承的一团糟。我知道这里有问题(例如"导入blah"其次是"来自blah import yuck")。我正在寻找最狡猾的方式来处理这个问题。
我只需要my_main_file.py中的导入吗?即将Common.py代码能够访问操作系统。如果"导入os"从模块中删除,i =仅在主脚本中。
是否最好只有在该模块中导入的模块中引用的导入,即使它们是相似的?即"来自Tkinter import Text"在一个模块和"来自Tkinter导入END"在另一个。
附带问题 - 哪个更好?
import Tkinter
或
from Tkinter import Menu
from Tkinter import WORD
from Tkinter import END
from Tkinter import Text
from Tkinter import Scrollbar
from Tkinter import Toplevel
from Tkinter import Button, Checkbutton
from Tkinter import Label
from Tkinter import Entry
from Tkinter import LEFT, RIGHT, TOP, BOTTOM
from Tkinter import DISABLED
from Tkinter import X, Y, BOTH
from Tkinter import VERTICAL, HORIZONTAL
from Tkinter import Listbox
from Tkinter import Frame, LabelFrame
from Tkinter import Entry
from Tkinter import N,S,E,W
from Tkinter import BROWSE, EXTENDED
from Tkinter import DISABLED, NORMAL
答案 0 :(得分:4)
根据the PEP8 styleguide(pythonic最权威的来源之一)使用通配符导入(from ... import *
)应该避免,除非你重新发布一个接口,这不是你的意图。
我的建议是import TKinter as tk
并参考tk.WORD
等。
执行此操作的原因之一是来自Tkinter
的一些常量和类通常被命名为N
,Button
等。
通过引用tk.N
,tk.Button
等,它使您在代码中的意图更加清晰。
答案 1 :(得分:0)
如果导入了一两件特定的东西,那么:
from Tkinter import END, Toplevel, ...
如果导入了该模块中的所有内容,那么:
from Tkinter import *
如果导入了多个函数和类,则:
import Tkinter
或更多pythonic:
import Tkinter as tk
答案 2 :(得分:0)
我不确定我们是否可以使用通用文件导入所有常用模块。我想,对于你提到的所有文件,你需要有单独的导入。
关于你的问题,最好从课堂上导入特定的功能,方法。您应该只导入那些在文件中使用的方法,函数。如果您只是import Tkinter
,那么您必须在代码中使用Tkinter.Menu
,Tkinter.WORD
等。如果文件中的许多地方使用了某些库或模块的函数,则可能很难阅读。因此,最好从模块导入所有必需的方法,函数并使用它们。您可以在一个班轮中导入同一个库中的许多功能。
答案 3 :(得分:0)
我过去解决这个问题的方法是在每个文件夹中都有一个__init__.py
文件,其中包含所有来源,然后你的所有导入都可以进入
有更好的方法来组织python文件。有关如何组织模块的更多信息,请参阅official documentation
同时结帐importanize
答案 4 :(得分:0)
同意最好避免使用来自Tkinter import * 的。
我发现在任何给定模块上处理长导入的一种方法。不完全干净,但比每行重复一次更少的罗嗦。
我会用你的TKinter导入列表完成它,但我没有安装它,所以改用 sys 。
#opening a parenthesis allows for implicit line feeds
from sys import (
stderr, stdout, stdin, #could have more...
#dont need this anymore
# maxint,
#maxsize, #dont this need anymore either
argv,
)
print globals().keys()
输出:
['stdout', '__builtins__', '__file__', 'stdin', 'argv', '__package__', 'stderr', '__name__', '__doc__']