2010-12-14 90 views
-1

Je suis un débutant et un peu perdu avec le code que j'ai écrit. J'écris un add-on pour certains logiciels, en essayant d'extraire des données de ses classes.Fonctions à l'intérieur de l'itération "pour", Python

Il existe une liste d'instructions pour lesquelles je suis en train d'utiliser l'opérateur. Je suis intéressé par deux types d'instructions appelées VC_STATEMENT_LINMOTION et VC_STATEMENT_PTPMOTION (il y en a beaucoup d'autres aussi). D'abord dans mon code je vois lequel de ces deux types de déclarations vont en premier. Si c'est LinMotion, alors, j'obtiens quelques valeurs d'extraction pour cette instruction LinMotion (en allant à cette fonction (def get_initalvalues ​​())) jusqu'à ce que le code "rencontre" l'instruction PtpMotion. Après cela, il va à la fonction def get_conf() où les données pour PtpMotion sont extraites. De même, dans get_conf() si LinMotion est rencontré plus tard, les données sont extraites de PtpMotion de la dernière itération.

Mais cela ne marche pas.

Je sais que cela semble lourd))). Peut-être que je l'ai moi-même fait trop compliqué et la solution est plus simple.

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() 

je vais essayer de montrer dans l'échantillon:

Si la déclaration de LinMotions va d'abord, avant PtpMotion puis:

LinMotion (certaines données initiales spéciales) LinMotion (encore des données initiales ... dans tous les autres instructions LinMotion prog utilise toujours les données initiales jusqu'à ce que l'instruction PtpMotion apparaisse:

PtpMotion (ses propres données PtpMotion)

si LinMotion apparaît à nouveau, les données de la dernière déclaration de PtpMotion est utilisé

Si la déclaration PtpMotion va d'abord, avant LinMotion, puis PtpMotion (ses propres données de PtpMotion)

Si Linmotion apparaît, les données de la dernière déclaration de PtpMotion est utilisé

+0

Combien d'instructions pouvez-vous avoir? Quelle sera la complexité de la séquence d'instructions? – kevpie

+0

il peut être n'importe quel nombre – Maks

+2

Définir "cela ne fonctionne pas". Qu'est-ce qui ne se passe pas? Qu'est-ce qui devrait arriver qui ne fonctionne pas? –

Répondre

2

(Modifier: J'ai mis à jour le code pour refléter les nouvelles informations dans votre message.)

Si je comprends correctement votre problème, une simple description de ce que vous essayez d'obtenir est la suivante: vous avez une liste de Statement instances dans main_routine.Statements et vous souhaitez exécuter un code différent basé sur statement.Type. Voici la structure naturelle cette habituellement (lire: presque toujours) prend en code Python. Honnêtement, je pense que tout le monde, pas seulement vous-même, est confus avec vous avez écrit. Passez à un flux de contrôle simple qui modélise vos données et vous devriez aller bien.