如何格式化从其他语言转换的Python脚本

时间:2018-02-15 17:01:19

标签: python indentation

我刚开始使用Python,我知道Python需要缩进,不像任何类似的语言。 但是当我从其他来源复制并粘贴一个源代码块时,代码大部分都是凌乱的,我必须一次又一次地为每一行做tab / backspace / home。

我目前的主要设置是带有Python扩展的Visual Studio代码, 我使用Emacs主要用于格式化程序,当我需要在Linux上编辑时。 https://www.emacswiki.org/emacs/ReformatBuffer

在过去,我可以使用Visual Studio或Emacs在几秒钟内格式化整个文件。

现在使用Python,你必须手动完成,这是浪费时间。 我尝试了几个IDE(Spyder等)和软件包(yapf)。 beind IDE的想法是,当你打字时,它们会帮助你,但不会试图重新启动所有东西。

例如,Spyder有一个修复缩进功能,但它只修复了标签/空格。 https://github.com/spyder-ide/spyder/issues/5565

虽然yapf仅在代码中没有缩进错误时才有效。

我的想法是,与C / C ++和其他语言不同,有一个" end"在Python语句中,因此工具无法知道当前行是否是块的最后一行?

因为我使用了多种语言,有时我只是将一些语言从一个语言复制到另一个语言并进行一些更改/替换。 例如(用IDL语言)

    boundary = read_binary(boundary_file, data_type = 4, data_dims = [ncolumn, nrow])  
    ;;==========================================================================================================
    nan_index = WHERE( boundary EQ missing_value, nan_count)
    good_index = WHERE( boundary NE missing_value, good_count)
    IF nan_count EQ 0 THEN BEGIN
       RETURN
    ENDIF ELSE BEGIN
       boundary[ nan_index ] = 0
       boundary[ good_index ] = 1
    ENDELSE 
    :do something else
    sFilename_rock = 'something'

我希望在替换后复制/粘贴后转换为python:

        def test
            import numpy as np
            sFilename_boundary = 'some_file'
        ifs = open(sFilename_boundary, 'rb')
    aBoundary = np.fromfile(ifs, '<f4')
    aBoundary.shape = (nrow, ncolumn)
    ifs.close()
        #==========================================================================================================
        nan_index = np.where(aBoundary == 1)
        nan_count = len(nan_index)

        if nan_count == 0 :
           pass
        else:
           boundary[ nan_index ] = 0
           boundary[ good_index ] = 1
    #something else
    sFilename_rock = 'something'

在这种情况下,整个代码结构变得对我不了解,我必须使用yapf逐个手动纠正它们。

请告知解决方案,谢谢。

1 个答案:

答案 0 :(得分:2)

使用系统剪贴板将Python粘贴到Emacs通常可以正常工作。这听起来像你正在使用粘贴方法,它基本上模拟了Emacs的输入(也许你使用一些原始的VT220类型的终端仿真远程运行Emacs?),这会导致Emacs添加缩进,你的粘贴代码已经包含它们。

您可以禁用自动缩进(可能粘贴到*scratch*缓冲区,然后使用Emacs的内部复制/粘贴到您正在使用的Python缓冲区中?)或在本地运行Emacs(可能连接到其他如果需要编辑远程系统上的文件,请使用Tramp系统。