Jump to content

Archived

This topic is now archived and is closed to further replies.

Renato Augusto

For/else em Python

Recommended Posts

Estou com uma dúvida bem amadora, e gostaria da ajuda de vocês. Tenho o seguinte código:

import time
 
serials = {"COM1": "idle", "COM2": "idle"}
 
class Teste(object):
    
    def getIdle(self):
 
        for port in serials:
            if serials[port] == 'idle':
                serials[port] = 'busy'
                return port
        else:
            time.sleep(5)
            self.getIdle()

O objetivo dele é percorrer um um dicionário e verificar se existe uma porta idle, caso exista, marca ela como busy e retorna a porta. Caso todas as portas estejam ocupadas (busy) ele entra no else do for e chama o mesmo método porém com um atraso pra dar tempo da porta ficar livre.

 

O problema é que ele nunca entra no else quando todas as portas estão ocupadas, aparentemente no Python é possível usar o else/for mas não deu certo aqui. Alguém pode apontar o erro?

Share this post


Link to post
Share on other sites

Você está trabalhando com threads?

 

 

import threading
import random
 
serials = {"COM1": "idle", "COM2": "idle"}
 
class Teste(object):
    
    @staticmethod
    def _has_idle(space):
        """ Verifica se existe alguma entrada marcando 'idle'.
         Caso não exista nenhuma, essa contagem será igual a zero, 
       o que significa que todas as entradas estão ocupadas.
        """
        return space.count('idle') == 0
 
 
    @staticmethod
    def _mark_busy():
        idle_keys = [k for k in serials if serials[k] == 'idle']
        chosen_key = random.choice(idle_keys)
        serials[chosen_key] = 'busy'
        return chosen_key
 
    @staticmethod 
    def get_idle():
        idle = Teste._mark_busy() if Teste._has_idle(serials.values()) else None
        return idle
 
 
 
if __name__ == '__main__':
    stask = threading.Timer(5.0, Teste.get_idle)
    stask.start()

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.