Для начала написания кода, как это:
condition and value1 or value2
был, как люди реализовали трехкомпонентный условный оператор в Python до:
value1 if condition else value2
conditional expression был введен в версии 2.5 из-за PEP 0308. Использование старого метода теперь устарело в пользу немного более эффективного и гораздо более читаемого более нового метода.
старый метод работает, потому что, как and
и or
работать в Python. Вместо того, чтобы возвращать логические результаты, как на большинстве других языков, эти операторы возвращают значения.
Выполнение a and b
возвращает a
, если a
- False
; в противном случае она возвращает b
:
>>> 0 and 1
0
>>> 1 and 0
0
>>> 1 and 2
2
>>>
Ведение a or b
возвращает a
если a
вычисляется в True
; в противном случае она возвращает b
:
>>> 1 or 0
1
>>> 0 or 1
1
>>> 1 or 2
1
>>>
Кроме того, в случае, если вы не знаете, 0
вычисляет False
в то время как каждый номер имеет значение True
.
Далее в коде, это:
isinstance(g, str) and g.lower() or g
на самом деле интерпретируется Python как:
(isinstance(g, str) and g.lower()) or g
Теперь, если isinstance(g, str)
возвращает False
(g
не является строкой):
(False and g.lower()) or g
False
возвращается and
:
False or g
и затем возвращается or
g
. Таким образом, мы избегали вызова .lower()
по нестрочному типу.
Если, однако, isinstance(g, str)
возвращает True
(g
является строкой):
(True and g.lower()) or g
and
возвращает g.lower()
:
g.lower() or g
, а затем возвращает or
g.lower()
, и это хорошо, потому что g
является строкой.
Подвела, эти два выражения:
g.lower() if isinstance(g,str) else g
isinstance(g, str) and g.lower() or g
функционально эквивалентны. Но, пожалуйста, используйте первый! Другое ужасно для удобочитаемости.
Не используйте 'list' как имя. 'list' - встроенная функция, и вам лучше оставить ее в покое. – gboffi
@gboffi Итак, список, str, dict, кортеж и т. Д. Все встроенные функции? –
Пожалуйста, разместите фактический код, который вы используете. В соответствии с этим строка 2 должна дать вам ошибку – inspectorG4dget