什么是更好的处理进口方式*

时间:2014-10-06 19:18:04

标签: python python-2.7

所以我有一个如下所示的课程:

class TestClass():
    from somewhere import *

    def test_function(self):
        pass

当然,我收到的语法警告只有在模块级别允许导入*。我所看到的所有帖子都是为什么这是一个坏主意,并没有提供一种更好地处理这个问题的方法。我们正在考虑迁移到Python 3,并且需要在移动之前将其作为我们的障碍之一。

那么处理这个问题的更好方法是什么?将导入语句放入__init__.py是否可以处理此问题?如果是这样,那会是什么样的?

2 个答案:

答案 0 :(得分:3)

更好的方法是import something,然后使用something.function_you_want_to_call而不是function_you_want_to_call

答案 1 :(得分:3)

如果您需要将somewhere中的所有元素添加为类的元素,则可以使用循环以及getattr()setattr()的组合:

import somewhere

class TestClass():
    def test_function(self):
        pass

for name in getattr(somewhere, '__all__', 
                    (n for n in dir(somewhere) if not n.startswith('_'))):
    setattr(TestClass, name, getattr(somewhere, name))

这将somewhere添加TestClassfrom somewhere import *语句完全相同的名称;要么__all__序列中列出的所有名称,如果设置,否则所有名称都不以下划线开头。

您应该在somewhere中创建一个基类,而不是导入单个属性(函数等),而不是:

class BaseSomewhere:
    somewhere_thing1 = 'something'

    def somewhere_thing2(self):
        # do something

然后导入

import somewhere

class TestClass(somewhere.BaseSomewhere):
    def test_function(self):
        pass