Как избежать написания имени модуля все время при импорте модуля в python? - PullRequest
5 голосов
/ 13 августа 2010

В последнее время я часто использую модуль math.Я не хочу писать math.sqrt(x) и math.sin(x) все время.Я хотел бы сократить его и написать sqrt(x) и sin(x).Как?

Ответы [ 4 ]

6 голосов
/ 13 августа 2010

Для более длинных имен модулей их обычно сокращают, например,

import numpy as np

Тогда вы можете использовать короткое имя. Или вы можете импортировать конкретный материал, который вам нужен, как показано в других программах:

from math import sin, sqrt

Это часто используется внутри пакетов, для кода, который более тесно связан. Для библиотек первый вариант с сокращением имени часто является предпочтительным способом.

То, что вы должны никогда делать, это использовать форму from math import *. Это загрязнит пространство имен, что может привести к конфликтам имен и усложнить отладку. Наиболее важно то, что это затрудняет чтение кода, поскольку неясно, откуда взялась конкретная функция.

Исключение может быть сделано в интерактивном переводчике. Но если вы привыкли использовать сокращенные имена, то, возможно, не стоит идти туда с другим соглашением.

5 голосов
/ 13 августа 2010
from math import sin, sqrt
# Then you can just do
sqrt(4)
5 голосов
/ 13 августа 2010

Вы можете импортировать так:

>>> from math import sqrt, sin
>>> sqrt(100)
10.0

От: Еще о модулях

Существует вариант оператора импорта, который импортирует имена измодуль непосредственно в таблицу символов импортирующего модуля.Например:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

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

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

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

1 голос
/ 13 августа 2010

позвольте мне добавить, что я рассматриваю не только 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 ) - это то, что вы хотите, и это также немного быстрее, чем вторая форма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...