Исправление отступов
Здравствуйте.
Есть питоновский исходник, он правился в разных редакторах (с разными настройками табуляции), в результате в некоторых местах сущая путаница с табами и пробелами в левых отступах.
В mc и в vim он отображается неправильно: строчки скачут. Тем не менее он нормально парсится питоном и работает .
Хочу заменить все пробелы на табы. Пробовал написать сам скрипт, который будет это делать, убил несколько часов, не получилось. В итоге руками правил код, сконвертил, но код работает не так, как раньше.
Не скажете, может есть какой-нибудь форматтер питоновского кода?
(под катом мой текущий скрипт)
Есть питоновский исходник, он правился в разных редакторах (с разными настройками табуляции), в результате в некоторых местах сущая путаница с табами и пробелами в левых отступах.
В mc и в vim он отображается неправильно: строчки скачут. Тем не менее он нормально парсится питоном и работает .
Хочу заменить все пробелы на табы. Пробовал написать сам скрипт, который будет это делать, убил несколько часов, не получилось. В итоге руками правил код, сконвертил, но код работает не так, как раньше.
Не скажете, может есть какой-нибудь форматтер питоновского кода?
(под катом мой текущий скрипт)
import sys, re
f = open(sys.argv[1], 'r')
strs = f.readlines()
f.close()
stack = []
nline = 0
first_line = True
last_was_d = False
for s in strs:
if re.search("^\s*$", s):
print s,
else:
spaces = re.search("^(\s*)", s).group(1)
ss = re.compile("^(\s*)").sub("", s)
if not (re.search("^\s*#", s) or re.search('^\s*"""', s)):
if spaces in stack:
i = stack.index(spaces)
stack = stack[:(i+1)]
elif last_was_d or first_line:
stack.append(spaces)
else:
sys.stderr.write(str((nline, ':', [s], stack, [spaces], last_was_d)))
assert(0)
first_line = False
if re.search(":\s*$", s) or re.search("^[^#]*:\s*#", s) or re.search("{\s*$", s):
last_was_d = True
else:
last_was_d = False
print '\t'*(len(stack)-1) + ss,
else:
if spaces in stack:
print '\t'*stack.index(spaces) + ss,
else:
print s,
nline = nline + 1
f = open(sys.argv[1], 'r')
strs = f.readlines()
f.close()
stack = []
nline = 0
first_line = True
last_was_d = False
for s in strs:
if re.search("^\s*$", s):
print s,
else:
spaces = re.search("^(\s*)", s).group(1)
ss = re.compile("^(\s*)").sub("", s)
if not (re.search("^\s*#", s) or re.search('^\s*"""', s)):
if spaces in stack:
i = stack.index(spaces)
stack = stack[:(i+1)]
elif last_was_d or first_line:
stack.append(spaces)
else:
sys.stderr.write(str((nline, ':', [s], stack, [spaces], last_was_d)))
assert(0)
first_line = False
if re.search(":\s*$", s) or re.search("^[^#]*:\s*#", s) or re.search("{\s*$", s):
last_was_d = True
else:
last_was_d = False
print '\t'*(len(stack)-1) + ss,
else:
if spaces in stack:
print '\t'*stack.index(spaces) + ss,
else:
print s,
nline = nline + 1
