自动对齐"表格式"Python代码

mit*_*ndi 4 python

我有一些Python代码看起来像这样:

rates = {3: [((17500, 99999), Decimal('23425.00'), Decimal('7234.24'))],
         4: [((    0,  3510), Decimal( '4563.00'), Decimal('5234.00')),
             (( 3510, 17500), Decimal('34578.00'), Decimal('3464.50')),
             ((17500, 99999), Decimal('18268.00'), Decimal('5734.66'))],
         5: [((17500, 99999), Decimal('83564.00'), Decimal('3475.60'))]}
Run Code Online (Sandbox Code Playgroud)

请注意,十进制值在小数点周围对齐,而整数是右对齐的.

是否有一些软件能够以自动化方式执行这种复杂的对齐?我会对任何接近的东西感兴趣,即使它与上述不完全匹配.

Jon*_*han 5

(注意:我不认为以下特别理智.)

在大多数情况下,如果你只是输入(大多数编辑将帮助你对齐你的词典和列表项)你的原始代码,你应该得到这样的东西:

rates = {3: [((17500, 199999), Decimal('23425.00'), Decimal('7234.245'))],
         4: [((0, 3510), Decimal('4563.00'), Decimal('5234.00')),
             ((3510, 17500), Decimal('34578.00'), Decimal('464.50')),
             ((17500, 99999), Decimal('18268.00'), Decimal('5734.66'))],
         15: [((17500, 99999), Decimal('83564.00'), Decimal('3475.60'))]}
Run Code Online (Sandbox Code Playgroud)

(我已经做了一些更长的值,有些更短,以增加更多的怪癖.)

使用Vim 的Tabular插件,按顺序对上面的代码执行以下命令(您可能希望以可视方式阻止它)将以与原始问题匹配的方式格式化上述代码:

:Tab /^[^[(]*\zs[[(]/l0
:Tab /^[^(]*\zs(/l0
:Tab /(\zs\d\+\s*,/l0r1
:Tab /,\s*\zs\d\+)/l1r0
:Tab /['"]\d*\ze\.\d*['"]/l0r0
Run Code Online (Sandbox Code Playgroud)

这些业务是:

  1. 对齐第一个[s和(s.
  2. 对齐第一个(s,这将修复第一个操作的错位.
  3. 右对齐(17500,类似的值,.
  4. 右对齐, 99999)类似的值,.
  5. 对齐'4563.00'类似的值..

您可以制作映射以在正常和可视模式下使用:

noremap <leader>ff :Tab /^[^[(]*\zs[[(]/l0<CR>
                  \:Tab /^[^(]*\zs(/l0<CR>
                  \:Tab /(\zs\d\+\s*,/l0r1<CR>
                  \:Tab /,\s*\zs\d\+)/l1r0<CR>
                  \:Tab /['"]\d*\ze\.\d*['"]/l0r0<CR>
Run Code Online (Sandbox Code Playgroud)

最后结果:

rates = {3:  [((17500, 199999), Decimal('23425.00'), Decimal('7234.245'))],
         4:  [((    0,   3510), Decimal( '4563.00'), Decimal('5234.00')),
              (( 3510,  17500), Decimal('34578.00'), Decimal( '464.50')),
              ((17500,  99999), Decimal('18268.00'), Decimal('5734.66'))],
         15: [((17500,  99999), Decimal('83564.00'), Decimal('3475.60'))]}
Run Code Online (Sandbox Code Playgroud)

显然,这些操作的有效性取决于代码的结构和原始格式,但希望这会激发您的灵感.