Предположим, у меня есть функция, которая может либо взять итеративный/итератор, либо неистребимый в качестве аргумента. Итеративность проверяется с помощью try: iter(arg)
.Метод Python для удаления итерации
В зависимости от того, является ли вход итерабельным или нет, результат метода будет другим. Не тогда, когда я хочу передать неистребимый как итерируемый ввод, это легко сделать: я просто оберну его кортежем.
Что делать, если я хочу передать итерабельность (например, строку), но хотите, чтобы функция воспринимала ее так, как будто она не итерируема? Например. сделать это iter(str)
не удается.
Edit - мое первоначальное намерение:
Я хотел обобщить функцию zip
в том, что она может пронестись итерируемой с не итерируемыми. Неистребимый будет тогда repeat
сам так часто, как другие итерации еще не закончены.
Единственное общее решение для меня теперь кажется, что я не должен проверять внутри функции general_zip
(из-за проблем с строкой); но вместо этого я должен добавить итератор repeat
к аргументу до, вызывающего zip
. (Это фактически спасает меня от изобретения функции general_zip
- хотя я все еще могу, потому что с неизменяемым в качестве ввода он будет недвусмысленным без дополнительного повтора.)
Путь Python предназначен для того, чтобы вызывающий мог быть явным и преобразовать неизменяемый в итерируемый. 'zip (my_list, itertools.repeat (42))' Это то же самое, что и писать '42 + int ('100')', если вы хотите добавить int и строку. Добавление магических преобразований приводит к угадыванию и путанице. – 2010-03-20 15:31:08
Да, правильно. Но мне нужно вызвать эту функцию много раз, и тогда мне придется делать проверку каждый раз, прежде чем называть ее. Это выглядит немного лишним. - Итак, причина, по которой мне нужна эта функция, является довольно узкой и четко определенной, однако я бы хотел, чтобы потенциальные возможности этой функции были максимально возможными. – Debilski