Import 在Python中,仅仅为了以更方便的方式公开而导入某些内容是否被认为是不好的做法?

Import 在Python中,仅仅为了以更方便的方式公开而导入某些内容是否被认为是不好的做法?,import,python,disqus,Import,Python,Disqus,如果没有一个例子,这可能是没有意义的。我在我的Django应用程序中使用,我正在包装它,以便更好地将其与我的应用程序的其余部分解耦 我有一个文件disqs.py,它导入disqsapi,并定义了许多辅助函数。在应用程序代码的其他地方,我可以简单地从mango import Discus添加,但在一些地方,有必要捕获在进行API调用时可能引发的异常。这意味着我不得不做一些类似的事情: from disqusapi import APIError from mango import disqus

如果没有一个例子,这可能是没有意义的。我在我的Django应用程序中使用,我正在包装它,以便更好地将其与我的应用程序的其余部分解耦

我有一个文件disqs.py,它导入
disqsapi
,并定义了许多辅助函数。在应用程序代码的其他地方,我可以简单地从mango import Discus添加
,但在一些地方,有必要捕获在进行API调用时可能引发的异常。这意味着我不得不做一些类似的事情:

from disqusapi import APIError
from mango import disqus

try:
    disqus.thread.fetch(1)
except APIError, error:
    logger.warn('Disqus API error: %s' % error)
相反,如果我在disqs.py顶部导入
apirerror
,我可以写:

from mango import disqus

try:
    disqus.thread.fetch(1)
except disqus.APIError, error:
    logger.warn('Disqus API error: %s' % error)
Pyflakes抱怨未使用的导入,但这似乎是合理的做法。我应该高兴地忽略Pyflakes吗,还是我错过了一个更好的选择


明确地说,我不需要以任何方式修改
discussapi.APIError
,因此子类化是不必要的。

如果您需要使用某个东西,并且它不会在您的命名空间中发生冲突,那么从x导入y
它并不是不合适的

但是,出于自我文档的考虑,您可能更喜欢第二个选项。如果有人正在阅读您的代码,他们可能不知道错误与哪个API有关,但是从名称空间中提取它可以避免任何歧义

在Python中,它被认为是坏的吗 习惯于将某事物单独输入到 以更方便的方式暴露它

简短回答:没有

答案很长,如果您正在编写一个包装器,使您自己的代码更简单、更容易理解,那么您可以做任何您喜欢的事情。如果您想要包装其他代码,或者导入模块并将其子类化,或者导入模块并更改其方法


如果您正在为其他人编写代码,可能需要添加注释来解释您正在做什么。如果只是为了你自己,这一切都很好。

一个
\uuuu init\uuuuuuuuy.py
或一个包充满了明显“未使用”的导入,这是很常见的。我认为pyflakes未使用的想法似乎有点简单化,因为可以清楚地看到,这个导入是在另一个模块中使用的

如果你不得不忽略它,那就太烦人了。也许pyflakes有某种杂注来覆盖这种行为


它的风格是否好实际上取决于应用程序的结构。我认为你可以为双方提出论点

我想我的问题是,你为什么不处理所有这些例外情况以及自定义Discus模块中的导入?可能在@kniteli更幸运?这当然是正确的方法,但在这种情况下,我只想记录发生的任何错误。应用程序代码应该说明如何处理错误,但您说的没错,捕获与disqs相关的异常的正确位置是在disqs.py中。我假设为了完全分离关注点,我会让助手函数接受在捕获异常时调用的回调。这可能是正确的方法,但会使应用程序代码和包装代码都稍微重一些。如果您希望在应用程序和discqus之间实现完全分离,您可以为discqus创建一个包装器,该包装器公开一个用于处理注释系统的通用API,然后,如果您想稍后交换一个新的注释系统,您可以使用相同的API编写另一个包装器。但是那太多的工作了。这是Python,不是J2EE。如果你的网络应用程序中有特定的代码,API警察不会逮捕你。继续使用disqs.APIError。当我无法使用合适的第三方
路径
对象时,我通常会将os.path导入为p和
j=p.join
。当人们试图理解你的代码时,首先会看到顶部的导入列表;虽然这不是一个好主意做
从。。。导入*
并污染您的命名空间(可能除了基本模块,如
math
itertools
子流程
等),这就是
从。。。导入…
是我的感觉。