在python中导入模块时是否有类似于`return`的模拟?

时间:2015-12-14 15:16:50

标签: python return python-import

声明

我知道,我可以简单地在if __name__ == '__main__ 下编写缩进的代码,或者将其放在函数中。但是,这会增加不必要的缩进级别。我也意识到这将是糟糕的风格,我应该写一个合适的模块。我只是想知道。当然,与setuptools一起使用的入口点甚至更好,人们不应该懒惰并使用virtualenv进行测试。我问这个问题的纯粹学术知识是否有命令提前完成导入文件'。

实际问题

可以提前返回函数以防止其余的函数代码执行。这样可以保存缩进级别。例如:

def my_func(arg):
    print arg
    if arg == 'barrier':
        return
    print 'arg is not barrier'
    # ...
    # alot more nested stuff that
    # will not be executed if arg='barrier'

与以下内容相比,保存缩进级别:

def my_func(arg):
    print arg
    if arg == 'barrier':
        return
    else:
        print 'arg is not barrier'
        # ...
        # alot more nested stuff that
        # is one indentation level deeper :-(

导入模块时是否可以执行类似操作,以便不导入其余代码? 例如,在模块文件中:

# !/usr/bin/python
# I'm a module and a script. My name is 'my_module.py'.
# I define a few functions for general use, and can be run standalone.

def my_func1(arg):
    # ... some code stuff ...
    pass

def my_func2(gra):
    # ... some other useful stuff ...
    pass

if __name__ != '__main__':
    importreturn   # Statement I'm looking for that stops importing
    # `exit(0)` here would exit the interpreter.

print 'I am only printed when running standalone, not when I'm imported!'
# ... stuff only run when this file is executed by itself ...

所以我没有看到&#34;我只在独立运行时打印,而不是在我导入时打印!&#34; ,当我这样做时:< / p>

import my_module.py
my_func2('foobar')

2 个答案:

答案 0 :(得分:2)

您不想避免缩进,缩进会简明扼要地说明您打算执行的代码:

if __name__ == '__main__':
    print "I am only printed when running standalone, not when I'm imported!"
else:
    print "I am only printed when importing"

如果你想要将它包装在一个函数中?

def main():
    if __name__ == '__main__':
        print "I am only printed when running standalone, not when I'm imported!"
        return
    print "I am only printed when importing"

main()

答案 1 :(得分:2)

不,在Python中没有声明。

最接近你想要的是引发异常并在try / except块中进行导入。提升声明后的代码不会被执行。

要真正实现这样的语句,您需要一个自定义导入处理程序来执行一些预处理和/或自定义编译器。如果您想了解Python内部结构,而不是应该在实际应用程序中使用的内容,这可能是一个有趣的挑战。