Декоратора Python вызывают существенно другим способом в зависимости от того, даете ли Вы ему аргументы или нет. Художественное оформление на самом деле просто (синтаксически ограничено) выражение.
В Вашем первом примере:
@redirect_output("somewhere.log")
def foo():
....
функция redirect_output
вызвана с данным аргументом, который, как ожидают, возвратит функцию декоратора, которая саму вызвана с foo
как аргумент, который (наконец!), как ожидают, возвратит финал украшенная функция.
эквивалентный код похож на это:
def foo():
....
d = redirect_output("somewhere.log")
foo = d(foo)
эквивалентный код для Вашего второго примера похож:
def foo():
....
d = redirect_output
foo = d(foo)
, Таким образом, Вы можете делать то, что Вы хотели бы, но не полностью бесшовным способом:
import types
def redirect_output(arg):
def decorator(file, f):
def df(*args, **kwargs):
print 'redirecting to ', file
return f(*args, **kwargs)
return df
if type(arg) is types.FunctionType:
return decorator(sys.stderr, arg)
return lambda f: decorator(arg, f)
Это должно быть в порядке, если Вы не будете хотеть использовать функцию в качестве аргумента Вашему декоратору, в этом случае декоратор неправильно предположит, что это не имеет никаких аргументов. Это также перестанет работать, если это художественное оформление будет применено к другому художественному оформлению, которое не возвращает функциональный тип.
альтернативный метод должен только потребовать, чтобы функция декоратора всегда вызывалась, даже если это без аргументов. В этом случае Ваш второй пример был бы похож на это:
@redirect_output()
def foo():
....
код функции декоратора был бы похож на это:
def redirect_output(file = sys.stderr):
def decorator(file, f):
def df(*args, **kwargs):
print 'redirecting to ', file
return f(*args, **kwargs)
return df
return lambda f: decorator(file, f)
Попробуйте что-нибудь вроде
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT - я не тестировал этот код, но это должно помочь вам решить проблему.
Вам нужно еще раз взглянуть на свой алгоритм. Каждый раз в цикле вы обмениваете один элемент (в случае shift = 1) со следующим.
0,1,2,3,4
1 , 0 ], 2,3,4
1, 2 , 0 , 3,4
1,2, 3 , 0 , 4
1,2,3, 4 , 0
0 , 2,3,4, 1
Вы можете выполнить операцию, которую хотите, но вам нужно подумать о том, как упорядочить шаги и их зависимости, чтобы получить правильный результат. В тривиальном случае вы можете просто работать в обратном направлении с конца.
0,1,2,3,4
4 , 1,2,3, 0
4,1 , 2, 0 , 3
4,1, 0 , 2 , 3
4, 0 , 1 , 2,3