2

假设我使用了一些依赖于另一个代码的第 3 方模块:

# third_party.py
from package import fun, A

class B(A):
    def foo(self):
        self.do()
        self.some()
        self.stuff()
        return fun(self)

然后我想在我的代码中继承这个类来改变功能:

# my_code.py

from third_party import B

# from third_party import fun?
# from package import fun?

class C(B):
    def foo(self):
        return fun(self)

更好的是:from package import fun还是from third_party import fun可以访问fun

我喜欢第二种变体,因为我可能不关心实际路径并从third_party包中导入所有依赖项,但是这种方式有什么缺点吗?这是一个好习惯还是坏习惯?

谢谢!

4

1 回答 1

1

我不认为从第三方包中导入函数/类是一种不好的做法,它甚至可能有一些好处(例如:如果你想给一个包打补丁,或者需要确定一些东西已经设置好了正确)。

甚至可能需要支持各种设置。考虑ElementTreeAPI,它在特定的 Python 版本上是不同的,甚至可能由第三方库提供(取自此处):

# somepackage.py

try:
  from lxml import etree
  print("running with lxml.etree")
except ImportError:
  try:
    # Python 2.5
    import xml.etree.cElementTree as etree
    print("running with cElementTree on Python 2.5+")
  except ImportError:
    try:
      # Python 2.5
      import xml.etree.ElementTree as etree
      print("running with ElementTree on Python 2.5+")
    except ImportError:
      try:
        # normal cElementTree install
        import cElementTree as etree
        print("running with cElementTree")
      except ImportError:
        try:
          # normal ElementTree install
          import elementtree.ElementTree as etree
          print("running with ElementTree")
        except ImportError:
          print("Failed to import ElementTree from any known place")

现在,它保证somepackage包含一个工作etree实现,即使在不同的 Python 安装上,并且您的包用作抽象。

于 2012-10-30T10:36:18.933 回答