/ / Aký je správny spôsob, ako zariadiť ťažkopádny dovoz - python, python-2.7, import

Aký je správny spôsob, ako zabezpečiť ťažkopádny import - python, python-2.7, import

Som celkom nový v Pythone a hľadám najlepší (najvýhodnejší) spôsob, ako zvládnuť import v projekte.

Dostal som za úlohu vyčistiť pythonský projekt a všimol som si, že v mnohých moduloch v projekte je to isté. Tu je príklad toho, čo vidím.

Súbor 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

Súbor gvars.py (tiež volá Tkinter)

from Tkinter import Text
from Tkinter import Tk
import Tkinter

Súbor Common.py (tiež volá gvars a os)

import gvars
import tkFileDialog
import os

Z menu / config.py (tiež volá Bežné, Gvars a 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

A ďalej a ďalej to ide ... Ako vidíte, toto je neporiadok, ktorý som zdedil. Viem, že tu existujú problémy (napríklad „import blah“, za ktorým nasleduje „from blah import yuck“). Hľadám len najtalentickejší spôsob, ako to zvládnuť.

Potrebujem import iba v súbore my_main_file.py? Tj. bude mať Common.py kód prístup k os. metódy, ak je "import os" odstránený z modulu a i = je iba v hlavnom skripte.

Je najlepšie mať iba dovozyuvedené v module importovanom v tomto module, aj keď sú podobné? Tj. „z importu textu Tkinter“ v jednom module a „z importovania textu Tkinter END“ v inom module.

Vedľajšia otázka - ktorá je lepšia?

import Tkinter

alebo

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

odpovede:

4 pre odpoveď č. 1

Podľa sprievodca štýlom PEP8 (jeden z najuznávanejších zdrojov informácií o tom, čo je pythonic) pomocou importu zástupných znakov (from ... import *), je potrebné sa vyhnúť, pokiaľ neuverejňujete rozhranie, ktoré nie je vaším zámerom.

Mojim návrhom je import TKinter as tk a odkazovať na tk.WORD atď.

Jedným z dôvodov je to, že niektoré konštanty a triedy z Tkinter majú pomerne všeobecné meno - N, Button, atď.

Odkazom na tk.N, tk.Button, atď. váš zámer v kóde je oveľa jasnejší.


0 pre odpoveď č. 2

Ak sa importuje jedna alebo dve konkrétne veci, potom:

from Tkinter import END, Toplevel, ...

Ak sa do tohto modulu importuje takmer všetko, potom:

from Tkinter import *

Ak sa importuje viac ako veľa funkcií a tried, potom:

import Tkinter

Alebo viac pythonic:

import Tkinter as tk

0 pre odpoveď č. 3

Nie som si istý, či môžeme mať spoločný súbor na import všetkých bežných modulov. Myslím si, že pre všetky súbory, ktoré ste spomenuli, musíte mať samostatný dovoz.

Pokiaľ ide o vašu vedľajšiu otázku, je lepšie importovať konkrétnu funkciu, metódu z triedy. Mali by ste importovať iba tie metódy, funkcie, ktoré sa používajú v súbore. ak tak urobíš import Tkinter, musíte to takto použiť Tkinter.Menu, Tkinter.WORD atď. vo vašom kóde. Potom by mohlo byť ťažké prečítať, či boli niektoré funkcie knižnice alebo modulu použité na mnohých miestach v súbore. Je preto lepšie importovať všetky požadované metódy, funkcie z modulu a používať ich. Mnoho funkcií môžete importovať z rovnakej knižnice. v jednej vložke.


0 pre odpoveď č. 4

Spôsob, akým som to v minulosti vyriešil, je mať __init__.py súbor v každom priečinku, kde existujú zdroje, potom tam môže ísť všetok váš import

Existujú ešte lepšie spôsoby usporiadania súborov python. Viac informácií o organizovaní modulov nájdete na úradnú dokumentáciu

Taktiež pokladňa importanize


0 pre odpoveď č. 5

Súhlasím s tým z importu Tkinter * je najlepšie sa vyhnúť.

Jeden spôsob, ako som zistil, že sa vysporiadal s dlhými dovozmi na ktorýkoľvek daný modul. Nie úplne čisté, ale horšie ako opakovanie 1 na riadok, ktoré máte.

Urobil by som to pomocou vášho zoznamu importov TKinter, ale nemám ho nainštalovaný, takže ho používam sys miesto.

#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()

výkon:

["stdout", "__builtins__", "__file__", "stdin", "argv", "__package__", "stderr", "__name__", "__doc__"]