У меня есть функция, которая пробует некоторый список параметров для подключения к ftp и подключается к первому серверу, который он мог.Как вернуться с заявлением?
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)
)
Далее в коде я пытаюсь что-то вроде этого
host = connect(*args)
host.walk()
Но сразу же после возврата соединение закрывается. Вероятно, это должно сработать, хотя я надеялся, что это не так. Но теперь я не знаю, как правильно инкапсулировать процессы подключения из прикладной логики.
Я имею в виду, конечно, я мог бы изменить это в продолжение прохождения стиль (это правильное название для этого, не так ли?)
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)
)
Но это кажется менее читаемым. Есть ли другие варианты?
Не обращайтесь непосредственно к своему вопросу, но кажется странным обернуть контекстный менеджер в try/except - почему бы не настроить '__enter__' и' __exit__'? – timgeb
Настроить где? FTPHost - это библиотека. Не под моим контролем. Извините, что я не сказал, что явно – user1685095
Это не из-под вашего контроля, всегда есть шаблон адаптера для библиотек, которые не делают именно то, что вы хотите, но почти :) В любом случае, извините за то, что вы отвлекаетесь. – timgeb