2013-04-28 3 views
1

Я, кажется, делает это много (или нет, я должен быть, возможно, другая тема) в моем питоне кодах:Python назначение стенография для * литья *

the_list = get_list_generator() 
#So `the_list` is a generator object right now 

#Iterate the generator pulling the list into memory 
the_list = list(the_list) 

При выполнении арифметических заданий, мы имеем Shorthands как такие как ...

the_number += 1 

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

#Maybe using a custom operator ? 
the_list @= list() 
#Same as above, `the_list` was a generator, but is a list after this line 

Edit ::

я не упомянул изначально: Это происходит со мной чаще всего в интерактивном режиме (таким образом, почему я хочу, чтобы сократить необходимый набор текста). Я попытаюсь проиндексировать итератор gen_obj[3], получить сообщение об ошибке, а затем отправить его.

Как и было предложено, это, вероятно, лучший, но в конечном итоге не совсем то, что я ищу.

the_list = list(get_list_generator()) 
+7

Как насчет 'the_list = список (get_list_generator())'? –

ответ

1

Не существует синтаксического ярлыка для преобразования итератора в список. Так что просто работает list(it) - это обычная практика.

Если ваша потребность только проверить результат, используйте взять() рецепт от модуля itertools:

def take(n, iterable): 
    "Return first n items of the iterable as a list" 
    return list(islice(iterable, n)) 

Этот рецепт работает особенно хорошо, когда основной итератора является длительным, бесконечным, или дорого вычислить.

+0

Это на самом деле довольно хорошо для моего интерактивного сценария, где я редко хочу на самом деле преобразовать всю итерабельность в список. И после нескольких тестов я обнаружил, что он довольно терпим к вводу.Он будет обрабатывать список и итераторы (поэтому мне не нужно уделять столько внимания), и, похоже, не жалуется, если диапазон неправильный (он просто возвращает пустой список). Итак, насколько я понимаю, что мой журнал интерактивных журналов чист, это делает трюк (я назову это сразу, как правило, избегая моей первоначальной потребности во втором переназначении). – user2097818

1

Нет

дополненной назначение работает только путем объединения операторов с присваивания. list(...) - это вызов функции , а не оператор. Вы можете найти список возможных дополненных заданий here

Если вы хотите избежать выполнения двух заданий, просто позвоните list.

1

Может быть, вы могли бы пойти другим путем:

Если у вас есть функция генератора, который вы хотели бы вернуть list, вы можете украсить его.

def apply(after): 
    import functools 
    "Apply a function to the result of a function call." 
    def decorator(func): 
     @wraps(func) 
     def wrapper(*a, **k): 
      return after(func(*a, **k)) 
     return wrapper 
    return decorator 

После того, как эту функцию, вы можете использовать его таким образом:

@apply(list) 
def get_list_generator(n): 
    yield n 

l = get_list_generator(12) 
+0

Для этого требуется немного больше предусмотрительности при использовании в интерактивном режиме, но он по-прежнему довольно гибкий, быстрый для применения и, безусловно, тип * стенографии *, который я изначально имел в виду. – user2097818