Python - написание более чистого (лучшего) кода - постоянное объявление и повторное объявление переменных - PullRequest
0 голосов
/ 16 февраля 2012

Для моего первого набега на python я написал некоторый код разбора, который работает так, как я задумал.

Я хотел бы поделиться этим кодом с некоторыми другими внешними людьми (потому что выполняемая им функция может быть полезна для них), и, честно говоря, мне очень стыдно за мой неуклюжий код из-за ... фактическая рабочая часть кода очень короткая, но я, кажется, потратил около 70% деклараций и повторного объявления переменных в файлах ...

Я почти уверен, что это неправильный способ сделать это, и я не прошу кого-то построчно выделять мою кодировку, но некоторые основные советы по наведению порядка бесполезны.

И да, todo это комментировать различные разделы, прежде чем я их выдвину ....

    import re, os
def setGlobals():
###################### match returns
global sigVersionMatch
global filepathMatch 
global statusMatch
global puidMatch
global mimeMatch 
global status2Match
global warningMatch 
global filenameMatch
global fileExtensionMatch
###################### Flags and counters
global lineCounter
global headerFlag
global newLine
###################### header variables
global headerLineOne
global headerLineTwo
global sigVersion 
###################### searches as a variable
global SearchForStatus 
global SearchForFilename 
global SearchForFilepath 
global SearchForPuid
global SearchForMime
global SearchForStatus2
global SearchForWarning
global SearchForFileExtension
####################### searchstring variables
global filepath
global status
global puid
global mime
global status2
global warning
global filename
global sigVersion
global fileExtension
###################### file name lists
global newfile
####################### Flag and counters settings
headerFlag = 0
lineCounter = 0
newLine=""
###################### search strings headers
headerLineOne = re.compile(r'(DROID Version,)')
headerLineTwo = re.compile(r'(Status,File,Warning,)')
sigVersion = re.compile(r'(?<=SigFile Version,")[0-9]*')
###################### search strings body
filepath = re.compile(r'(?P<filepath>(F:\\ExLib.*\w))')
status = re.compile(r'(?P<status>(?<!,")(Positive|Not identified|Tentative))')  
puid = re.compile(r'(?P<puid>(x-fmt/|fmt/)([0-9]{1,3}))')   
mime = re.compile(r'(?P<mime>([a-zA-Z]*\/([a-zA-Z]|\-)*(?=",)))')   
status2 = re.compile(r'(?P<status2>(Positive \(Specific Format\)|Positive \(Generic Format\)|(Tentative)(?=(",""))))')
warning = re.compile(r'(?P<warning>(Possible file extension mismatch))') 
filename = re.compile(r'(?P<filenam>(V[0-9]\-.*\w))')
headerLineOne = re.compile(r'(DROID Version,)')
headerLineTwo = re.compile(r'(Status,File,Warning,)')
sigVersion = re.compile(r'(?<=SigFile Version,")[0-9]*')
fileExtension = re.compile(r'(?<=\.).*')
def doSearches(line):
global SearchForStatus 
global SearchForFilename 
global SearchForFilepath 
global SearchForPuid
global SearchForMime
global SearchForStatus2
global SearchForWarning
global SearchForFileExtension
global status
global filename
global filepath
global puid
global mime
global status2
global warning
global fileExtension
global filepathMatch 
global statusMatch
global puidMatch
global mimeMatch 
global status2Match
global warningMatch 
global filenameMatch
global fileExtensionMatch
####### do searches
SearchForStatus = status.search(line)
SearchForFilename = filename.search(line) 
SearchForFilepath = filepath.search(line) 
SearchForPuid = puid.search(line)
SearchForMime = mime.search(line)
SearchForStatus2 = status2.search(line)
SearchForWarning = warning.search(line)
###### convert search returns to strings
if SearchForStatus:
    doInitialseVariables()
    statusMatch = str(SearchForStatus.group())
if SearchForFilename:
    filenameMatch = str(SearchForFilename.group())
    SearchForFileExtension = fileExtension.search(filenameMatch)
    if SearchForFileExtension:
        fileExtensionMatch = str(SearchForFileExtension.group())        
if SearchForFilepath:
    filepathMatch = str(SearchForFilepath.group())      
if SearchForPuid:
    puidMatch = str(SearchForPuid.group())
if SearchForMime:
    mimeMatch = str(SearchForMime.group())
if SearchForStatus2:
    status2Match = str(SearchForStatus2.group())
if SearchForWarning:
    warningMatch = str(SearchForWarning.group())
if statusMatch == str("Not identified"):
    doBuildLine(line)
if SearchForPuid:
    doBuildLine(line)   
def doBuildLine(line):
global filepathMatch 
global statusMatch
global puidMatch
global mimeMatch 
global status2Match
global warningMatch 
global filenameMatch
global fileExtensionMatch
global newLine
global lineCounter
global newfile
lineCounter = lineCounter + 1
print lineCounter
newLine = "3,"+ str(sigVersionMatch)+",slow," + str(lineCounter) + ",,," + str(filepathMatch) + "," + str(filenameMatch) + ",," + str(statusMatch) + ",,," + str(fileExtensionMatch) + ",," + str(warningMatch) + ",,," + str(puidMatch) + "," + str(mimeMatch) + ",,\n"
outfile = open(newfile,"a")
outfile.write(newLine)
outfile.close() 
def doInitialseVariables():
global filepathMatch 
global statusMatch
global puidMatch
global mimeMatch 
global status2Match
global warningMatch 
global filenamMatch
global lineOnceFlag
global fileExtensionMatch
global lineOneFlag
global lineTwoFlag
puidMatch = ""
mimeMatch= ""
status2Match = ""
warningMatch = "" 
statusMatch = ""
filepathMatch = ""
filenameMatch = ""  
fileExtensionMatch = ""
def doGetHeaderVariables(line):#matches header lines, strips sig version, saves as sigVersionMatch
global sigVersionMatch
M1 = headerLineOne.search(line)
M2 = headerLineTwo.search(line)
M3 = sigVersion.search(line)
if M3:
    sigVersionMatch = str(M3.group())
def doStartProcessing(line):
global headerFlag
global lineCounter
if headerFlag == 0: #stops header match testing once successfully complete
    doGetHeaderVariables(line)
    headerFlag = 1
doSearches(line)
if __name__ == "__main__":
setGlobals()
global newfile
doInitialseVariables() #sets up the variable space to begin 
directory = "C:\droid\logs\\"
extension = ".csv"
list_of_files = [file for file in os.listdir(directory) if file.lower().endswith(extension)]
for currentfile in list_of_files:
    logpath = str(directory)+str(currentfile)
    newfile = str(directory) + "cleaned\\" + str(currentfile)
    for line in open(logpath,'r'):
        doStartProcessing(line)
    headerFlag = 0
    lineCounter = 0

Ответы [ 4 ]

6 голосов
/ 16 февраля 2012
  1. Вы должны использовать оператор global только для имен, которые вы собираетесь переназначить в функции. Вы можете получить любое имя, которое хотите, без него, включая доступ к нему для вызова метода, который изменит объект.

  2. Ваш код был бы значительно упрощен, если бы вы использовали класс. Глобальные переменные станут атрибутами объекта, а ваши функции станут методами.

  3. Не используйте вкладки для отступа, используйте пробелы (код будет читаться выше, если вы сделаете это).

  4. Вам не нужно компилировать регулярные выражения, прежде чем использовать их. Модуль re автоматически компилирует и кэширует для вас.

1 голос
/ 18 февраля 2012

Как думать как компьютерный ученый Отличная книга для начинающих, в которой в качестве языка используется Python.Он охватывает классы и объекты в ясной форме с хорошими примерами.Бонус: это бесплатно, но не позволяйте этому обмануть вас.:)

1 голос
/ 16 февраля 2012

Серьезно предложите Марк Кац "Learning Python" для действительно хороших разделов об использовании глобальных и локальных переменных, объявлений функций и т. Д.

Ничего не значит, потому что яЯ знаю, что я собирал вещи вроде этого на ранних этапах, но поместил этот код в защищенный паролем файл, прочитал эту книгу, переписал ее, а затем показал ее публике.Никогда не позволяйте никому, кроме себя, иметь пароль к этому файлу.Его основное использование будет напоминать вам, как далеко вы продвинулись за удивительно короткое время.

Тем не менее, действительно хорошо, продолжайте работать с этим большим количеством регулярных выражений.

1 голос
/ 16 февраля 2012
  1. Если вы еще не прошли урок:

    • http://docs.python.org/tutorial/

    • Если возникают вопросы о чем-то, с чем вы сталкиваетесь, поднимите вопрос здесь.

  2. Чтение PEP-8

    • Это Библия форматирования кода Python.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...