Я пишу утилиту на Python, которая будет прикреплять измененные файлы в Subversion к электронному письму и отправлять его, когда подмножество папок, находящихся под контролем версий в SVN, было изменено. Я использую библиотеку pysvn для доступа к репозиторию.
У меня есть копии файлов в моей локальной файловой системе, и я делаю обновление, чтобы проверить, изменились ли файлы с момента последнего запуска утилиты.
Я нахожусь в точке, где я переводю имена путей в SVN в имена путей в моей локальной копии.
В настоящее время я написал следующее, чтобы выполнить эту работу:
def formatPaths(self, paths):
newPaths = list()
for path in paths:
path = path[len(self.basePath):]
path = path.replace("/", "\\")
newPaths.append(path)
return newPaths
self.basePath будет чем-то вроде «/ trunk / project1», и я просто хочу получить относительный путь к подмножеству папок (т.е. folder1 в «/ trunk / project1»).
Это хороший способ решить эту проблему или я пропустил какую-то волшебную функцию?






Хм ... Вот бы это было:
baselen = len(self.basePath)
for path in paths:
path = path[baselen:].replace("/", "\\")
newPaths.append(path)
return newPaths
Если хотите, можете сделать это так:
baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)
Не вычислять baselen на каждой итерации цикла также является хорошей практикой.
Оставайтесь с оператором среза, но не изменяйте переменную цикла внутри цикла. для удовольствия попробуйте выражение генератора (или оставьте listcomp).
baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)
Обновлено: lstrip () здесь не актуален. Из руководство по эксплуатации:
str.lstrip([chars])
Return a copy of the string with leading characters removed. If chars is omitted or None, whitespace characters are removed. If given and not None, chars must be a string; the characters in the string will be stripped from the beginning of the string this method is called on.
Ваше конкретное решение для копии имени пути является разумным, но ваше общее решение всей проблемы может быть улучшено.
Я бы использовал easy_install anyvc, библиотеку, разработанную для PIDA IDE, который представляет собой унифицированный интерфейс Python для систем управления версиями, и использовал бы ее вместо этого:
from anyvc import Subversion
vc = Subversion('/trunk')
modified = [f.relpath for f in vc.list() if f.state != 'clean']
for f in modified:
print f.relpath # the relative path of the file to the source root
Кроме того, я бы, вероятно, прикрепил различие к электронному письму, а не к фактическому файлу. Но я думаю, это твой выбор.
Я тоже думал о разнице, но, к сожалению, это не в моих силах.