Как превратить мой маленький код oneliner в multiliner в python3?

#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