Изменяемые аргументы по умолчанию - (Почему) мой код опасен? - PullRequest
0 голосов
/ 20 апреля 2020

Мой код вызывает предупреждение в pylint:

def getInsertDefault(collection=['key', 'value'], usefile='defaultMode.xml'):
    return doInsert(collection,usefile,True)

Предупреждение довольно ясно, оно Изменяемые аргументы по умолчанию , я получаю точку зрения в нескольких случаях, что это может дать неправильное впечатление от происходящего. На SA уже есть несколько постов, но не кажется, что этот здесь покрыт. Большинство вопросов и примеров имеют дело с пустыми списками, которые имеют слабые ссылки и могут вызвать ошибку.

Я также знаю, что лучше изменить код на getInsertDefault(collection=None ...), но в этом методе для инициализации по умолчанию, Я не собираюсь ничего делать со списком, кроме чтения, (почему) мой код опасен или может привести к ошибкам?

- РЕДАКТИРОВАТЬ -

В точку: Почему пустой словарь является опасным значением по умолчанию в Python? будет отвечать на вопрос. Вид: я знаю, что мой код противоречит соглашению и может привести к ловушке - но в этом очень конкретном c случае: я в безопасности?

Я нашел предложение в комментариях полезным для использования collection=('key', 'value') вместо этого, как это обычно и безопасно. Тем не менее, из чистого интереса: может ли моя предыдущая попытка создать какую-то серьезную проблему?

1 Ответ

1 голос
/ 20 апреля 2020

Если предположить, что doInsert() (и любой код doInsert вызывает) только когда-либо читает collection, действительно, немедленной проблемы нет - просто бомба замедленного действия.

Как только любая часть кода, увидевшая этот список, начнет изменять его, ваш код будет поврежден самым неожиданным образом, и вам может быть трудно отладить проблему (представьте, если что изменяет функцию библиотеки 3-ей части за десятки кадров стека ... и это в лучшем случае, когда проблема и ее причина root все еще находятся в той же прямой ветви стека вызовов - она ​​может храниться как экземпляр атрибут где-то и видоизменяется каким-то несвязанным вызовом, а потом вас ждет какое-то веселье) время от времени, не обязательно взламывая sh программу) и трудно отслеживать ошибки, которые это вызывает, вы должны дважды подумать, прежде чем предположить, что это действительно"безопасно".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...