Ich habe eine Funktion, die versucht, eine Liste von Parametern mit ftp zu verbinden und verbindet sich mit dem ersten Server, der es könnte.Wie komme ich mit Aussage zurück?
def connect(params):
for user, passw, host in params:
try:
import pdb;pdb.set_trace()
with FTPHost(host, user, passw) as h:
return h
except FTPError as e:
logger.debug("Can't connect to ftp error is {}".format(e))
else:
raise Exception(
"Can't connect to ftp server with none of the {}".format(params)
)
Weitere in Code Ich versuche, etwas wie das
host = connect(*args)
host.walk()
Aber gleich nach der Rückkehr die Verbindung geschlossen wird. Das ist wahrscheinlich, wie es funktionieren sollte, denke ich, obwohl ich hoffte, dass es nicht würde. Aber jetzt weiß ich nicht wirklich, wie man Versuche der Verbindung von der Anwendungslogik richtig kapselt.
Ich meine sicher könnte ich dies in Übertragungsstil Fortsetzung ändern (dies ist für die korrekte Name, nicht wahr?)
def connect(params, some_application_function):
for user, passw, host in params:
try:
import pdb;pdb.set_trace()
with FTPHost(host, user, passw) as host:
some_application_function(host)
except FTPError as e:
logger.debug("Can't connect to ftp error is {}".format(e))
else:
raise Exception(
"Can't connect to ftp server with none of the {}".format(params)
)
Aber das scheint weniger lesbar. Gibt es noch andere Möglichkeiten?
Nicht direkt auf Ihre Frage, aber es scheint komisch, einen Kontextmanager in try/except zu packen - warum nicht "__enter__" und "__exit__' anpassen? – timgeb
Einstellen wo? FTPHost ist eine Bibliothek. Nicht in meiner Kontrolle. Entschuldigung, dass ich das nicht ausdrücklich angegeben habe – user1685095
Es ist nicht außerhalb Ihrer Kontrolle, es gibt immer das Adaptermuster für Bibliotheken, die nicht genau das tun, was Sie wollen, aber fast :) Wie auch immer, Entschuldigung für die Ablenkung. – timgeb