2015-05-01 2 views
3

Я заметил в коде Python это обычно предпочитают импортировать в явном виде части модуля вам нужно, например,Python Imports Конвенция

from django.core.urlresolvers import reverse 
from django.db import models 

Однако я заметил, что это, кажется, не будет корпус для стандартных модулей библиотеки Python, где я обычно вижу, например:

import os 
import sys 

something = os.path.join('home', 'ludo') 
other = sys.argv('dunno') 

вместо

from os.path import join 
from sys import argv 

something = join('home', 'ludo') 
other = argv('dunno') 

есть любая аргументация или документированная конвенция для этого?

+1

Я бы обычно придерживался некоторой комбинации: количества вещей, необходимых от каждого «импорта» (я бы не переходил четыре или пять в «из панели импорта foo, baz, ...»); длина имени модуля (т.сколько персонажей приходится набирать каждый раз, хотя там используется aliasing типа 'import tkinter as tk'); количество раз я планирую назвать каждую вещь, которую я импортирую; и т.п. – jonrsharpe

ответ

7

holy style guide является довольно свободно относительно этого предмета:

При импорте класса из модуля класса, содержащего, обычно хорошо пишется так:

from myclass import MyClass 
from foo.bar.yourclass import YourClass 

Если это написание вызывает местное имена имен, а затем заклинания их

import myclass 
import foo.bar.yourclass 

и использовать «myclass.MyClass» и «foo.bar.yourclass.YourClass».

На самом деле для этого нет никаких «правил», только некоторые указатели, упомянутые выше. Если вам не препятствуют, например, имя конфликтует, вы можете делать все, что сочтете нужным.

Однако, как было упомянуто в ссылке, вы должны иметь в виду, что

подстановочные импорт (из импорта *) следует избегать, так как они делают неясным, какие имена присутствуют в пространстве имен, путают как читатели, так и многие автоматизированные инструменты.

1

Относящиеся к ответу Тима Castelijns', это также является приемлемой альтернативой:

from my_module import models as my_models 
from their_module import models as their_models 

class MyOtherModel(their_models.Foo): 
    ... 

class MyThirdModel(my_models.Bar): 
    ... 

То есть, вы имеете право для назначения альтернативных имен импортированным модулям. Однако вы должны учитывать читаемость, поэтому убедитесь, что остается открытым, на какой модуль ссылаются.

В качестве примера, при выводе классов из другой модели, вы можете сделать так:

# in myproject.views 
from shop.views.cart import CartDetails as ShopCartDetails 

class CartDetails(ShopCartDetails): 
    # my overridden methods 
    ... 

Это дает возможность сослаться на то же имя класса при ввозе его в urls.py:

# in myprojects.urls 
from myproject.views import CartDetails 

    ... 
    url(r'^cart/$', CartDetails.as_view(), name='cart'), 
    ...