Вы не передаете **locals()
функциям?
Поскольку в Python отсутствует оператор "include", и параметр self
является явным, правила определения области действия и довольно просты, обычно очень легко указать пальцем на переменная и сообщает откуда этот объект - без чтения других модулей и без какой-либо IDE (которые в любом случае ограничены в способе самоанализа из-за того, что язык очень динамичен).
import *
ломает все это.
Кроме того, он имеет конкретную возможность скрывать ошибки.
import os, sys, foo, sqlalchemy, mystuff
from bar import *
Теперь, если модуль bar имеет какой-либо из атрибутов "os
", "mystuff
" и т. Д., Они будут переопределять явно импортированные атрибуты и, возможно, будут указывать на совершенно разные вещи. Определение __all__
в строке часто целесообразно - здесь указывается, что будет импортироваться неявным образом, - но все же трудно отследить, откуда берутся объекты, не читая и не анализируя модуль бара и не следуя его импортам. Сеть import *
- это первое, что я исправляю, когда вступаю во владение проектом.
Не поймите меня неправильно: если бы не было 1025, я бы заплакал, чтобы получить его. Но это должно быть использовано осторожно. Хорошим вариантом использования является предоставление интерфейса фасада поверх другого модуля.
Аналогично, использование операторов условного импорта или импорта внутри пространств имен функций / классов требует некоторой дисциплины.
Я думаю, что в средних и больших проектах, или небольших, с несколькими участниками, требуется минимум гигиены с точки зрения статического анализа - запуск по крайней мере pyflakes или, что еще лучше, правильно настроенного pylint - чтобы поймать несколько видов ошибок, прежде чем они произойдут.
Конечно, поскольку это python - не стесняйтесь нарушать правила и исследовать - но опасайтесь проектов, которые могут вырасти в десять раз, если в исходном коде отсутствует дисциплина, это будет проблемой.