J'ai le code ci-dessous et je veux retourner msg à chaque fois comment puis-je faire?
quelqu'un peut-il m'aider? p> p>
3 Réponses :
Vous voulez probablement envisager de tourner votre fonction en générateur, à l'aide du mot-clé code> de rendement code> au lieu de Lorsque votre générateur se termine, donc conclure, vous Peut structurer votre code comme suit: P> retour code>. De cette manière, mettre fin à votre cycle avec rendement msg code>, votre fonction générera une séquence de messages, une par itération dans le cycle. msg code > est Aucun code>, un STOVITÉTÉTRAITATION code> sera soulevé, rendant le pour code> Terminez la boucle comme prévu. P> def callee():
while ...:
elem = ...
yield elem
def caller():
for elem in callee():
...
il ne vient qu'une seule fois et sortit ça n'a pas fonctionné
Pouvez-vous s'il vous plaît fournir un exemple expliquant votre problème avec cette solution?
~~~~ Importer peut DEF ABCD (): bus = can.interface.bus (canal = '1', bustype = 'vecteur', app_name = 'python-peut') msg = bus.recv (0.5) pendant que msg est Non aucun: msg = bus.recv (1) rendement msg def abcd_2 (): pour msg in abcd (): impression (msg) renvoyer msg si nom b> == ' Main b > ': abcd_2 () ~~~~~~ j'ai essayé cela, mais cela ne donne aucune sortie
Votre code n'est pas lisible dans un commentaire, pouvez-vous mettre à jour votre message d'origine en ajoutant la nouvelle version de votre code en bas?
Comme mentionné par @elia geretto, vous devrez peut-être le convertir en fonction de générateur.Le sais que cela change ces changements aidera.
import can
def abcd():
bus = can.interface.Bus(channel= '1', bustype='vector',app_name = 'python-can')
MSG = bus.recv(0.5)
while MSG is not None:
MSG = bus.recv(1)
yield MSG
if __name__ == '__main__':
for op in abcd():
print(op) # or you can use next() as well.
À la place de l'impression, je veux retour
Vous pouvez collecter tous les rendements dans une liste et faire votre traitement.
Je ne suis pas complètement sûr de ce que vous voulez, mais je pense que l'un des problèmes est que l'objet code> code> est créé à chaque fois. Vous pourriez essayer le code suivant. Je ne peux pas le tester moi-même depuis que je n'ai pas de bus Can disponible. Je ne sais pas non plus quelle est la méthode de retour. Si vous pouvez améliorer la question, je peux aussi améliorer la réponse: -)
import can
def read_from_can(bus):
msg = bus.recv(0.5)
while msg is not None:
msg = bus.recv(1)
return msg
def main():
# create bus interface only once
bus = can.interface.Bus(channel='1', bustype='vector', app_name='python-can')
# then read (for example) 10 times from bus
for i in range(10):
result = read_from_can(bus)
print(result)
if __name__ == '__main__':
main() # Tip: avoid putting your code here; use a method instead
Pouvez-vous essayer de décrire le comportement que vous voulez? Je suppose que la méthode
bus.recv () code> renvoie les données actuellement disponibles (un ou plusieurs octets). Voulez-vous un résultat dès qu'il sera disponible, ou après une certaine quantité de silence dans le bus? Et voulez-vous toutes les données (concaténées) ou uniquement le dernier octet? Je pense qu'il y a plusieurs problèmes avec votre code, mais j'ai besoin de plus d'informations pour fournir une bonne réponse.