/ /扱いにくいインポートを配置する正しい方法は何ですか-python、python-2.7、import

扱いにくいインポートを整理する正しい方法 - python、python-2.7、import

私は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 import yuck」に続く「import blah」など)。私はこれを処理するための最もPython的な方法を探しています。

my_main_file.pyのインポートのみが必要ですか?つまりCommon.pyコードはosにアクセスできます。 「import os」がモジュールから削除され、i =がメインスクリプトのみにある場合のメソッド。

唯一のインポートを持つことが最善ですかそれらが類似していても、そのモジュールにインポートされたモジュールで参照されていますか?つまり1つのモジュールの「Tkinterインポートテキストから」と別のモジュールの「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

回答:

回答№1は4

による PEP8スタイルガイド (pythonicとは何かに関する最も権威のある情報源の1つ)ワイルドカードのインポート(from ... import *)インターフェイスを再公開する場合を除き、これは避けてください。これは意図ではありません。

私の提案は import TKinter as tk 参照してください tk.WORD

これを行う理由の1つは、いくつかの定数とクラスが Tkinter かなり一般的な名前です- N, Button

参照することにより tk.N, tk.Buttonなど、コードの意図がより明確になります。


回答№2の場合は0

1つまたは2つの特定のものがインポートされる場合:

from Tkinter import END, Toplevel, ...

そのモジュールのほとんどすべてがインポートされる場合、次のようになります。

from Tkinter import *

多数の関数とクラスがインポートされる場合:

import Tkinter

またはもっとpythonic:

import Tkinter as tk

回答№3の場合は0

すべての共通モジュールをインポートするための共通ファイルがあるかどうかはわかりません。質問したすべてのファイルについて、個別のインポートが必要だと思います。

サイドの質問については、特定の関数、メソッドをクラスからインポートすることをお勧めします。ファイルで使用されているメソッド、関数のみをインポートする必要があります。ただやるなら import Tkinter、それを次のように使用する必要があります Tkinter.Menu, Tkinter.WORD コードなどに。 ライブラリまたはモジュールの関数がファイルの多くの場所で使用されている場合、読みにくい場合があります。したがって、必要なすべてのメソッド、モジュールから関数をインポートして使用することをお勧めします。 1つのライナーで。


回答№4の場合は0

過去にこれを解決した方法は、 __init__.py ソースが存在する各フォルダー内のファイル、すべてのインポートはそこに行くことができます

Pythonファイルを整理するさらに良い方法があります。モジュールの編成方法の詳細については、 公式文書

チェックアウト 輸入する


回答№5の場合は0

同意する Tkinterインポートから* 避けるのが最善です。

特定のモジュールでの長いインポートを処理する方法を見つけました。完全にクリーンではありませんが、1行に1回繰り返すよりも冗長です。

私はあなたの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__"]