2016-10-17 4 views
1

Итак, у меня есть два отдельных пакета Python, которые я импортирую в свой скрипт Python для Raspberry Pi. В этом случае as;Импортирование одинаково названных методов

from rflib import* 
from Rpi.GPIO import* 

Однако оба пакета имеет свой собственный индивидуальный метод cleanup(self)

Так, в конце сценария, когда я использую команду cleanup(), как я а) знать, какой пакет метод исходит из (они оба делают совершенно разные вещи b) контролируют, какой из них выполняется?

Я посмотрел в так же назвали questions, но, кажется, иметь дело с наследования перегрузки, а не импорта пакета

+6

Простой, не используйте 'from module import *', импортируйте сам модуль и используйте атрибуты. –

+2

И последний импорт выигрывает, поэтому 'Rpi.GPIO.cleanup() 'в этом случае. Вы не можете связаться с другим, потому что имя переопределено, поэтому старый 'cleanup = rflib.cleanup' исчез. –

+0

Хорошо, но при условии, что вы выполнили 'import *' - какой метод запущен? Первый, который нужно импортировать? – davidhood2

ответ

5

from <module> import * принимает все имена в модуле (те, которые не начинаются с _ или всем перечисленными в <module>.__all__ и присваивает эти имена как глобал в текущем модуле

Если два модуля. определяет то же имя, что означает, что последний один импортирована этот путь победу;. cleanup = rflib.cleanup заменяется cleanup = Rpi.GPIO.cleanup со вторым from Rpi.GPIO import * заявления

Вы вообще хотите избежать USI ng from <module> import *. Импортируйте конкретные имена или только сам модуль.

В этом случае, вы можете сделать:

from rflib import cleanup as rflib_cleanup 
from Rpi.GPIO import cleanup as rpigpio_cleanup 

, который будет связывать эти две функции, различных имен.

Или вы можете просто импортировать модули:

import rflib 
from Rpi import GPIO 

, который дает вам только rflib и GPIO имена, каждая ссылка на объект модуля, так что теперь вы можете ссылаться на каждый из cleanup функций в качестве атрибутов на эти модули:

rflib.cleanup() 
GPIO.cleanup() 

Если вам нужно использовать много имен из любого модуля, последний стиль является предпочтительным, потому что это ограничивает количество импорта вам нужно сделать, сохраняет пространство имен в чистоте и un-cluttered, и дает вам больше контекста, если эти имена используются в вашем коде.

2

Это не очень хорошая практика, чтобы использовать * с import. Вы должны делать что-то вроде:

import rflib 
from Rpi import GPIO 

# Clean Up 1 
rflib.cleanup 

#Clean Up 2 
GPIO.cleanup() 

Дополнительных пайс информации:

В случае, если ваши файлы/объекты имеют то же имя, в этом случае вы должны использовать as с import. Например:

from file1 import utils as file1_utils 
    from file2 import utils as file2_utils 

    file1_utils.my_func() 
    file2_utils.my_func() 
Смежные вопросы