Функции внутри "для" итерации, Python - PullRequest
0 голосов
/ 14 декабря 2010

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

Существует список операторов, для которых я выполняю оператор. Меня интересуют два типа операторов, которые называются VC_STATEMENT_LINMOTION и VC_STATEMENT_PTPMOTION (есть также много других типов). Сначала в моем коде я вижу, какой из этих двух типов утверждений идет первым. Если это LinMotion, то я получаю некоторые значения извлечения для этого оператора LinMotion (переходя к этой функции (def get_initalvalues ​​())), пока код не «встретит» оператор PtpMotion. После этого он переходит к функции def get_conf (), где извлекаются данные для PtpMotion. Кроме того, в get_conf (), если позднее встречается LinMotion, данные берутся из PtpMotion последней итерации.

Но это не работает.

Я знаю, это звучит тяжело))). Может быть, я сам сделал это слишком сложным, а решение проще.

for statement in main_routine.Statements:
    if statement.Type == VC_STATEMENT_LINMOTION or statement.Type == VC_STATEMENT_PTPMOTION:


        def get_conf(*args):
            global output
            if statement.Type == VC_STATEMENT_PTPMOTION:
                ptp_motion_conf = ""
                Extracted string data is assigned to ptp_motion_conf which is later added to overall output

                output += ptp_motion_conf 
            elif statement.Type == VC_STATEMENT_LINMOTION:
                output += ptp_motion_conf #using data of VC_STATEMENT_PTPMOTION from last iteration

        def get_initialconf(*args):
            global output
            if statement.Type == VC_STATEMENT_LINMOTION:
                ...


            elif statement.Type == VC_STATEMENT_PTPMOTION:
                get_conf()        


        statements = [] # getting list of statements to know which of LinMotion or PtpMotion goes first
        for statement in main_routine.Statements:  
            statements.append(statement.Type) 

        if statements.index("LinMotion") < statements.index("PtpMotion"): #statement LinMotion goes first
            get_initialconf()  
        elif statements.index("LinMotion") > statements.index("PtpMotion"):#statement PtpMotion goes first
            get_conf()

Я постараюсь показать в примере:

Если оператор LinMotions идет первым, перед PtpMotion, то:

LinMotion (некоторые специальные исходные данные) LinMotion (все еще исходные данные) ... во всех других операторах LinMotion программа до сих пор использует исходные данные до появления оператора PtpMotion:

PtpMotion (собственные данные PtpMotion)

если снова появляется LinMotion, используются данные из последнего оператора PtpMotion

Если оператор PtpMotion идет первым, перед LinMotion, тогда PtpMotion (собственные данные PtpMotion)

Если появляется Linmotion, используются данные из последнего оператора PtpMotion

1 Ответ

2 голосов
/ 14 декабря 2010

( Изменить : я обновил код, чтобы отразить новую информацию в вашем сообщении.)

Если я правильно понимаю вашу проблему, простое описание того, что вы пытаетесьДостигните этого: у вас есть список Statement экземпляров в main_routine.Statements, и вы хотите выполнить другой код, основанный на statement.Type.Вот естественная структура, которую обычно (читай: почти всегда) принимает в коде Python.

# no idea what this is in your code, but since you want to save it
# to a file, I'll blindy assume it is a string.
output = ""

# current stream of statements. accumulate as long as type is compatible.
stream = []

# process each statement.
for statement in main_routine.Statements:

    if statement.Type == VC_STATEMENT_LINMOTION:
        stream.append(statement)

    elif statement.Type == VC_STATEMENT_PTPMOTION:
        if (len(stream) > 0) and (stream[-1].Type == VC_STATEMENT_LINMOTION):
            output += process_linmotion_stream(stream)
            stream = []
            continue
        stream.append(statement)

    # ignore other types of statements.

# after loop, make sure leftover statements are processed.
output += process_linmotion_stream(stream)

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

...