Python中“import as”的用例

4
我想知道是否可以使用 "import as" 来创建相对紧凑或易读的代码。 我知道它的常见用例,基于 PEP 的避免名称冲突。
以下是情况(为演示目的简化)。 假设我有一个模块名为 process_words.py。

process_words.py:

def word_to_lower(word):
    return word.lower

process_article.py(让主脚本运行):

import process_words

word = "HELLO"
word_lower = process_words.word_to_lower(word)
print(word_lower)

现在做这样的事情是好还是不好的实践呢?
import process_words as pw

word = "HELLO"
word_lower = pw.word_to_lower(word)
print(word_lower)

这只是一个非常简单的例子。我有几个模块,每个模块都有几个函数。使用from module import something导入每个函数不是一个选项。对我来说,如果我使用import as和一些快捷名称,它会提高代码的可读性。你有什么想法吗?
注意:我指的是自定义模块。

个人而言,我不喜欢使用 as 重命名导入。但有时是必须的,例如当您想将两个具有相同名称的对象导入到一个命名空间中时。 - Klaus D.
1
请自行判断。如果您有一些经常使用的内容,那么制作一个简短的别名可能会有所帮助(例如,在使用SQLAlchemy时,通常会使用“import sqlalchemy as sa”),但是如果您有太多别名,则可能会难以记住。对于第一次阅读的人来说,他们必须查找这些别名的含义。 - Ry-
@KlausD。是的,避免名称冲突通常是常见的用例。然而,我对于使用它来提高可读性很感兴趣,尽管这有点主观。 - utengr
@Ryan 我通常只有非常有限的模块(2-5个),因此别名也会受到限制,因为我根据我的用例从它们中导入模块而不是特定的函数。 - utengr
1
你能够导入别名的原因是技术上的,正如先前所提到的。恐怕任何关于“更好的可读性”的事情都可能是主观的,无法在这里回答。 - Felk
显示剩余4条评论
2个回答

5

一个实际的问题是,当你开始更改已使用的库或模块时,在不改变代码的情况下切换实际导入的位置:import somemodule将变为import newmodule as somemodule

当我编写Python 2/3兼容性代码(我想像six这样的包有相当多的这类代码)时,我会在try-except块中执行此操作。例如:

try:
    # Are we using Python 2?
    import StringIO as io
except ImportError:
    # No, we're using Python 3 instead
    import io

你是在谈论import as的用例吗?我猜你想说,在这种特定情况下,这个import as可以用于切换实际的import,同样地,在我的用例中,我也可以用它来创建别名。如果是这样的话,如果你能就它与我的问题的关系进行一些澄清,那么我就可以接受它作为答案了。 - utengr
Python 2/3 中的另一件事是 urllib.parse 等函数(它们相同,但位置不同)。我也看到过这种情况,例如在 except 块中执行 io = None 的可选依赖项... 不确定我的感觉如何。 - Andy Hayden

3
一般情况下应尽量避免使用as导入。但当导入名称广泛使用时,例如numpy总是np,pandas总是pd,则可以大有作为。您不必查找名称,只需坐在看不见的代码库前面:看到np.array,您就知道发生了什么。虽然它只是稍微缩短了一点,但可以更轻松地跳过它。
另一个可能有用的时间是在单个模块中,该模块无处不在地使用另一个模块,每隔几行或十行就会调用此模块。然后我会考虑使用as导入来缩小文件的大小(以供阅读)。
我之前曾在一个非常薄的flask应用程序中这样做,该应用程序是一个可测试的模块的简单包装。
如果它只是内部API(并且从上下文中完全清楚其含义),则也许将其命名为pw.py而不是process_words.py是有意义的。在我看来,它有点太短了,但words.py可能很好(但“处理”是一个比较通用的词,因此我可能会寻找一个更具体的动词...)。上下文很重要,例如作为words的子模块,可能有必要将其称为funcs。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接