Вложенные операторы try в python?

Попробуйте приведенный ниже код:

NSString *versionString = [[UIDevice currentDevice] systemVersion];
30
задан Lorenzo Donati 8 October 2013 в 23:05
поделиться

4 ответа

Возможно, Вы могли попробовать что-то вроде этого:

def call_attrs(obj, attrs_list, *args):
    for attr in attrs_list:
        if hasattr(obj, attr):
            bound_method = getattr(obj, attr)
            return bound_method(*args)

    raise AttributeError

Вы назвали бы его как это:

call_attrs(a, ['method1', 'method2', 'method3'])

Это попытается назвать методы в порядке, в котором они находятся в списке. Если бы Вы хотели передать какие-либо аргументы, то Вы могли бы просто провести их после списка как так:

call_attrs(a, ['method1', 'method2', 'method3'], arg1, arg2)
22
ответ дан Jason Baker 27 November 2019 в 23:45
поделиться

Небольшое изменение во вторых взглядах, довольно хороших и простых. Я действительно сомневаюсь, что Вы заметите любое различие в производительности между этими двумя, и это немного более хорошо, чем вложенный try/excepts

def something(a):
    for methodname in ['method1', 'method2', 'method3']:
        try:
            m = getattr(a, methodname)
        except AttributeError:
            pass
        else:
            return m()
    raise AttributeError

Другой очень читаемый путь состоит в том, чтобы сделать..

def something(a):
    try:
        return a.method1()
    except:
        pass

    try:
        return a.method2()
    except:
        pass

    try:
        return a.method3()
    except:
        pass

    raise AttributeError

В то время как долго, очень очевидно, что делает функция.. Производительность действительно не должна быть проблемой (если несколько операторов попытки/кроме замедляют Ваш сценарий заметно, существует, вероятно, большая проблема со структурой сценария),

24
ответ дан dbr 27 November 2019 в 23:45
поделиться

Если Вы используете модернизированный объект:

methods = ('method1','method2','method3')
for method in methods:
    try:
        b = a.__getattribute__(method)
    except AttributeError:
        continue
    else:
        b()
        break
else:
    # re-raise the AttributeError if nothing has worked
    raise AttributeError

Конечно, если Вы не используете модернизированный объект, можно попробовать __dict__ вместо __getattribute__.

Править: Этот код мог бы оказаться кричащей путаницей. Если __getattribute__ или __dict__ не найден, возьмите произвольное предположение, какая ошибка повышена.

1
ответ дан David Berger 27 November 2019 в 23:45
поделиться

Как насчет того, чтобы инкапсулировать вызовы в функции?

def method_1_2_or_3():
    try:
        a.method1()
        return
    except AttributeError:
        pass
    try:
        a.method2()
        return
    except AttributeError:
        pass
    try:
        a.method3()
    except AttributeError:
        raise
4
ответ дан 27 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: