Как превратить мой небольшой код oneliner в многострочный в python3?

Я по ошибке сделал единичный фрагмент кода с помощью этого Onelineizer, и теперь я застрял, пытаясь сделать его многострочным. Мне нужно сделать его читабельным, но я не могу этого сделать с моими текущими знаниями.

(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()не является функцией, которую я определил, она добавлена ​​этим инструментом. ИДК, если это помогает, но я не мог получить любой ключ после посещения моих фиксаций: это обязательство, что техника его подводит HAD Oneliner Doesnt Have Oneliner, но это было что коммит Oneliner Имеет Oneliner в строке 38.

Изменить: Выполнив некоторую отладку, я обнаружил, что всякий раз, когда я комментировал эту строку, я получал 32 результата из моего теста, но когда я раскомментировал, я получил 34 результата. Кроме того, когда я напечатал self.argv.domain и parsed_url.netloc в очень похожем коде

print(self.argv.domain)
print(parsed_url.netloc)
(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)
print(self.argv.domain)
print(parsed_url.netloc)

Я получил такой вывод:

[!] Getting data from http://localhost/example.js
Before Self.argv.domain: None
Before Parsed_url.netloc: localhost
After Self.argv.domain: localhost
After Parsed_url.netloc: localhost
[!] Getting data from http://localhost/example.html
Before Self.argv.domain: None
Before Parsed_url.netloc: localhost
After Self.argv.domain: localhost
After Parsed_url.netloc: localhost

что указывает на то, что argv.domain установлен на parsed_url.netloc.

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
Другие вопросы по тегам