Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Python. Неочевидное поведение некоторых конструкций

Anna | 16.06.2014 | нет комментариев
Рассмотрены примеры таких конструкций некоторые явственные, но не менее небезопасные конструкции, которых в коде желанно чураться. Статья рассчитана на python программистов с навыком 0 — 1,5 года. Опытные разработчики могут в коментах покритиковать либо дополнить своими примерами.

1. Lambda.
переменная pw в lambda — ссылка на переменную, а не на значение. К моменту вызова функции переменная pw равна 5

Проблемный код

to_pow = {}
for pw in xrange(5): 
    to_pow[pw] = lambda x: x ** pw 
print to_pow[2](10)  # 10000 ??? 
Решение: Передавать все переменные в lambda очевидно

to_pow = {}                       
for pw in xrange(5):
    to_pow[pw] = lambda x, pw=pw: x ** pw 
print to_pow[2](10)  # 100 

2. чудесный порядок поиска признаков при ромбоидальном наследовании в классах классического и нового жанра

class A():
    def field(self):
        return 'a'

class B(A):
     pass

class C(A):
     def field(self):
        return 'c'

class Entity(B, C):
    pass

print Entity().field()  # a !!!
class A():
    def field(self):
        return 'a'

class B(A):
     pass

class C(A, object):  # New style class
     def field(self):
        return 'c'

class Entity(B, C):
     pass

print Entity().field()  # c !!!

3. Изменяемые объекты в качестве значений по умолчанию

Магия:

def get_data(val=[]):

    val.append(1)
    return val

print get_data()  # [1]
print get_data()  # [1, 1]    ???
print get_data()  # [1, 1, 1]    ???
Решение:

def get_data(val=None): 
    val = val or []
    val.append(1)
    return val 

print get_data()  # [1]  
print get_data()  # [1]

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, для которых придумали особые наименование для большей колоритно

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB