忽略python文件的其余部分

时间:2015-08-12 15:27:54

标签: python python-2.7

我的python脚本通常在文件的第一部分包含“可执行代码”(函数,类和& c),最后包含“测试代码”(交互式实验)。

我希望pythonpy_compilepylint& c完全忽略最后的实验内容。

我正在为#if 0寻找类似cpp的内容。

如何做到这一点?

以下是一些想法及其不良原因:

  1. sys.exit(0):适用于python,但不适用于py_compilepylint
  2. 将所有实验代码放在def test():下:我无法再将代码复制/粘贴到python REPL中,因为它有非平凡的缩进
  3. 将所有实验代码放在"""行之间:emacs不再缩进并正确地使代码充实
  4. 一直评论和取消注释代码:我太懒了(是的,这是一键按键,但我必须记住这样做!)
  5. 将测试代码放入一个单独的文件中:我想将相关内容保存在一起
  6. PS。我的IDE是Emacs,我的python解释器是pyspark

7 个答案:

答案 0 :(得分:3)

使用ipython而非python用于REPL它具有更好的代码完成和内省,当您粘贴缩进代码时,它可以自动"去缩进"粘贴的代码。

因此,您可以将实验代码放入测试函数中,然后粘贴部分而不必担心并且必须对代码进行去缩进。

如果要粘贴可被视为单个块的大块,则需要使用%paste%cpaste魔法。

例如

    for i in range(3):
        i *= 2 
        # with the following the blank line this is a complete block

        print(i)

使用普通粘贴:

In [1]:         for i in range(3):
   ...:                 i *= 2
   ...:     

In [2]:             print(i)
4

使用%paste

In [3]: %paste
        for i in range(10):
            i *= 2

            print(i)

## -- End pasted text --
0
2
4

In [4]: 

PySpark和IPython

  

也可以在增强的Python解释器IPython中启动PySpark。 PySpark适用于IPython 1.0.0及更高版本。要使用IPython,请在运行bin / pyspark时将IPYTHON变量设置为1: 1

$ IPYTHON=1 ./bin/pyspark

答案 1 :(得分:2)

不幸的是,没有广泛(或任何)标准描述你在谈论什么,所以让一堆python特定的东西像这样工作将是困难的。

但是,你可以用这样的方式包装这些命令,使它们只读到一个能指。例如(假设您使用的是unix系统):

cat $file | sed '/exit(0)/q' |sed '/exit(0)/d' 

该命令将一直读到'退出(0)'找到了。您可以将其输入您的检查器,或创建您的检查员阅读的临时文件。您可以在可能与编辑一起工作的路径上创建包装器可执行文件。

Windows可能能够使用类似的技术。

我可能会建议一种不同的方法。单独的文件可能是最好的。您可以探索iPython笔记本作为可能的解决方案,但我不确定您的用例是什么。

答案 2 :(得分:1)

使用python-mode.el将任意块标记为部分 - 例如通过py-sectionize-region

拨打py-execute-section

评论后更新:

python-mode.el由melpa提供。

M-x list-packages RET

寻找python-mode - 内置的python.el提供'python,而python-mode.el提供'python-mode。

开发刚刚移到此处:https://gitlab.com/python-mode-devs/python-mode

答案 3 :(得分:1)

遵循选项2的内容。
我通常将实验代码放在主方法中。

def main ():
    *experimental code goes here *

然后,如果你想执行实验代码,只需调用main。

main()

答案 4 :(得分:1)

我认为标准(' Pythonic')处理这个问题的方法是这样做:

LIKE

<击>

在评论后修改

我不认为使用普通的Python解释器可以实现你想要的东西。您可以查看IEP Python编辑器(websitebitbucket):它支持类似Matlab的单元格模式,其中可以使用双注释字符定义单元格({{ 1}}):

class MyClass(object):
    ...

def my_function():
    ...

if __name__ == '__main__':
    # testing code here

##开始行的所有代码,直到下一个这样的行或文件结尾构成单个单元格。 每当光标位于特定单元格内并且您触发一些热键(默认为Ctrl + Enter)时,该单元格中的代码将在当前运行的解释器中执行。 IEP的另一个特性是可以使用F9执行所选代码;一个非常标准的功能,但这里的好处是IEP会巧妙地处理空白,所以只需从方法中选择和粘贴内容就会自动生效。

答案 5 :(得分:1)

我建议您使用正确的版本控制系统来保持&#34;真实的&#34;和实验&#34;零件分开。

例如,使用Git,您只能在提交中包含没有实验部分的实际代码(使用add -p),然后暂时stash运行各种工具的实验部分。< / p>

您还可以将实验部分保存在自己的分支中,然后在需要时将rebase放在非实验部分的顶部。

答案 6 :(得分:0)

另一种可能性是将测试作为doctests放入代码的文档字符串中,这无疑只适用于更简单的情况。

这样,它们仅被doctest模块视为可执行代码,但作为其他注释。