1. Lambda.
переменная pw в lambda — ссылка на переменную, а не на значение. К моменту вызова функции переменная pw равна 5
Проблемный код
| Решение: Передавать все переменные в lambda явно
|
2. Отличный порядок поиска атрибутов при ромбоидальном наследовании в классах классического и нового стиля
|
|
3. Изменяемые объекты в качестве значений по умолчанию
Магия:
| Решение:
|
4. Значения по умолчанию инициализируются единожды
import random
def get_random_id(rand_id=random.randint(1, 100)):
return rand_id
print get_random_id() # 53
print get_random_id() # 53 ???
print get_random_id() # 53 ???
5. Не учтена иерархия исключений. Если вы не держите в голове подобные списки docs.python.org/2/library/exceptions.html#exception-hierarchy + списки исключений встроенных модулей + иерархию исключений вашего приложения, а также не используете PyLint. То можно написать следующее:
KeyError никогда не отработает
try:
d = {}
d['xxx']
except LookupError:
print '1'
except KeyError:
print '2'
6. Кэширование интерпретатором коротких строк и чисел
str1 = 'x' * 100
str2 = 'x' * 100
print str1 is str2 # False
str1 = 'x' * 10
str2 = 'x' * 10
print str1 is str2 # True ???
7. Неявная конкатенация.
Пропущенная запятая не генерирует исключений а приводит к слиянию смежных строк. Такая ситуация может произойти когда после последнего элемента в кортеже не поставили необязательную запятую, а затем строки в кортеже перегруппировали, отсортировали
tpl = (
'1_3_dfsf_sdfsf',
'3_11_sdfd_jfg',
'7_17_1dsd12asf sa321fs afsfffsdfs'
'11_19_dfgdfg211123sdg sdgsdgf dsfg',
'13_7_dsfgs dgfdsgdg',
'24_12_dasdsfgs dgfdsgdg',
)
8. Природа булевого типа.
True и False это самые настоящие 1 и 0, для которых придумали специальные название для большей выразительности языка.
try:
print True + 10 / False * 3
except Exception as e:
print e # integer division or modulo by zero
7. Устаревшая конструкция. Опасна тем что потеря слэша, либо перенос только первой части выражения не приводит в очевидным ошибкам. Как решение — использовать круглые скобки.
x = 1 + 2 + 3 \
+ 4
9. Операторы сравнения and, or в отличии например от PHP не возвращают True или False, а возвращают один из элементов сравнения, в этом примере current_lang будет присвоен первый положительный элемент
current_lang = from_GET or from_Session or from_DB or DEFAULT_LANG
Такое выражение как альтернатива тернарному оператору так же будет работать, но стоит обратить внимание, что если первый элемент списка окажется '', 0, False, None, то будет возвращён последний элемент в сравнении, а нет первый элемент списка.
a = ['one', 'two', 'three']
print a and a[0] or None # one
10. Перехватить все исключения и при этом никак их не обработать. В этом примере ничего необычного не происходит, но такая конструкция таит в себе опасность и весьма популярна среди начинающих. Так писать не стоит, даже если вы уверены на 100% что исключение можно никак не обрабатывать, так как это не гарантирует что другой разработчик не допишет в блок try-except строку, исключение от которой хотелось бы всё таки зафиксировать. Решение: пишите в лог, конкретизируйте перехватываемый тип исключений, обрамляйте в try-except лишь минимально необходимый кусок кода.
try:
# Много кода, чем больше тем хуже
except Exception:
pass
11. Переопределение объектов из bulit-in. В данном случае переопределяется объекты list, id, type. Использовать классические id, type в функции и класс list в модуле привычным образом не получится. Как решение — установить PyLint в свою IDE и следить что он подсказывает.
def list(id=DEFAULT_ID, type=TYPES.ANY_TYPE):
"""
W0622 Redefining built-in "id" [pylint]
"""
return Item.objects.filter(id=id, item_type=type)
12. Работающий код, без сюрпризов… для вас… А вот другой разработчик, использующий mod2.py весьма удивится, заметив, что один из атрибутов модуля вдруг неожиданно изменился. Как решение стараться избегать таких действий, или хотяб вводить в mod2.py функцию для переопределения атрибута. Тогда изучая mod2.py можно будет хотя б понять, что один из атрибутом модуля может меняться.
# mod1.py
import mod2
mod2.any_attr = '123'
PS: Критика, замечания, дополнения приветствуются.
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:
- Massacres That Matter - Part 1 - 'Responsibility To Protect' In Egypt, Libya And Syria
- Massacres That Matter - Part 2 - The Media Response On Egypt, Libya And Syria
- National demonstration: No attack on Syria - Saturday 31 August, 12 noon, Temple Place, London, UK
Комментариев нет:
Отправить комментарий