позвольте мне добавить, что я рассматриваю не только from math import *
случай загрязнения пространства имен, но также from math import cos
. это потому, что когда вы делаете это в верхней части модуля foo
, а затем смотрите на пространство имен этого модуля с помощью import foo; print( dir( foo ) )
, у вас будет элемент cos
в этом списке. как правило, это не то, что вы хотите.
так что большую часть времени все мои импортные операции выглядят как from math import cos as _cos
, основным символом подчеркивания является условное обозначение частного имени. идея заключается в том, что при импорте из другого модуля и распечатке import foo; print( name for name in dir( foo ) if not name.startswith( '_' ) )
вы получите именно те имена, которые были определены в этом модуле как публичные.
есть одна вещь, о которой следует знать: from math import cos as _cos; f = lambda x: _cos( x )
функционально не на 100% идентичен import math; g = lambda x: math.cos( x )
. разница в том, что в python разрешение имен происходит во время выполнения, каждый раз, когда вызывается код. при первом импорте имя cos
разрешается только один раз; любые последующие изменения в модуле math
не влияют на f()
. при втором импорте cos
будет преобразовываться в math
каждый раз, когда он вызывается, поэтому изменения в cos
методе математического модуля будут распространяться на g()
. конечно, модуль math
не должен изменяться во время выполнения и не меняет метод модуля во время выполнения, особенно рекомендуемый метод программирования. с другой стороны, модуль - это просто объект, как и все остальное в python, поэтому стоит всегда быть в курсе, что происходит под капотом.
обычно, from math import cos as _cos; f = lambda x: _cos( x )
- это то, что вы хотите, и это также немного быстрее, чем вторая форма.