#python #python-3.x #refactoring #python-3.7 #one-liner
#питон #python-3.x #рефакторинг #python-3.7 #однострочный #python
Вопрос:
Я по ошибке выделил фрагмент кода, используя этот Onelineizer, и теперь застрял, пытаясь сделать его multiliner.
(lambda __after: [__after() for self.argv.domain in [(parsed_url.netloc)]][0] if parsed_url.netloc and not self.argv.domain else __after())(lambda: None)
self.argv — это parser.parse_url()
из argparse, а parsed_url — это from urllib.parse import urlparse; parsed_url = urlparse(someurl)
. Я думаю, что код мог быть написан примерно так:
if parsed_url.netloc and not self.argv.domain:
something
Я не могу сделать больше выводов, может кто-нибудь помочь мне снова сделать его читаемым.
Кроме того, __after()
это не функция, определенная мной, она добавлена этим инструментом.
Комментарии:
1. Разве у вас нет копии исходного кода, который вы загрузили в инструмент?
2. Был ли исходный код многострочной функцией? (т.Е. Вы сейчас ищете эквивалентную многострочную функцию для этого лямбда-выражения?)
3. Это была не функция, а ожидание if condition iirc
4. Да, все это эквивалентно
if-else
инструкции. Это точно. Я пытаюсь проработать деталиif
иelse
части из того, что вы опубликовали. Интересно…5. @fountainhead
__after()
не является рекурсивным вызовом, поскольку__after
это простоlambda: None
аргумент.
Ответ №1:
Onelinerizer использует понимание списка для перевода операторов присваивания:
[__after() for self.arg.domain in [(parsed_url.netloc)]][0]
эквивалентно:
self.arg.domain = parsed_url.netloc
__after()
итак, вся ваша строка эквивалентна:
if parsed_url.netloc and not self.argv.domain:
self.arg.domain = parsed_url.netloc