Попробуйте приведенный ниже код:
NSString *versionString = [[UIDevice currentDevice] systemVersion];
Возможно, Вы могли попробовать что-то вроде этого:
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)
Небольшое изменение во вторых взглядах, довольно хороших и простых. Я действительно сомневаюсь, что Вы заметите любое различие в производительности между этими двумя, и это немного более хорошо, чем вложенный 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
В то время как долго, очень очевидно, что делает функция.. Производительность действительно не должна быть проблемой (если несколько операторов попытки/кроме замедляют Ваш сценарий заметно, существует, вероятно, большая проблема со структурой сценария),
Если Вы используете модернизированный объект:
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__
не найден, возьмите произвольное предположение, какая ошибка повышена.
Как насчет того, чтобы инкапсулировать вызовы в функции?
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