Распространенные ошибки
1. Ловушка изменяемых аргументов по умолчанию
def append_to_list(value, lst=[]):
lst.append(value)
return lst
## Unexpected behavior
print(append_to_list(1)) ## [1]
print(append_to_list(2)) ## [1, 2]
Правильный подход
def append_to_list(value, lst=None):
if lst is None:
lst = []
lst.append(value)
return lst
2. Время вычисления аргументов по умолчанию
graph TD
A[Default Argument] --> B[Evaluated Once]
B --> C[At Function Definition]
B --> D[Not at Function Call]
Возможные проблемы
import time
def log_timestamp(timestamp=time.time()):
print(f"Timestamp: {timestamp}")
## Multiple calls will show same timestamp
log_timestamp()
log_timestamp()
3. Переопределение сложных аргументов по умолчанию
Проблематичный шаблон
def create_config(settings={"debug": False}):
settings['debug'] = True
return settings
## Unexpected mutation
config1 = create_config()
config2 = create_config()
print(config1, config2) ## Both will have debug=True
Безопасная реализация
def create_config(settings=None):
if settings is None:
settings = {"debug": False}
settings = settings.copy()
settings['debug'] = True
return settings
4. Порядок именованных аргументов
Некорректное использование
def register_user(username, email, active=True, role="user"):
return {
"username": username,
"email": email,
"active": active,
"role": role
}
## Potential confusion
user = register_user("john", "[email protected]", "admin") ## Incorrect
Корректное использование
user = register_user("john", "[email protected]", role="admin")
5. Сложности с подсказками типов
| Ошибка | Пример | Решение |
| ---------------------------- | ----------------------------- | ------------------------------ | ------------ |
| Подсказки неизменяемых типов | def func(x: list = [])
| Используйте x: list | None = None
|
| Сложные типы по умолчанию | def func(config: dict = {})
| Инициализируйте внутри функции |
6. Вопросы производительности и памяти
def memory_intensive_default(large_data=complex_computation()):
## Computation happens only once
pass
Лучшие практики с LabEx
- Всегда используйте
None
для изменяемых значений по умолчанию
- Ясно указывайте типы аргументов
- Будьте осторожны при использовании подсказок типов
- Избегайте сложных вычислений для аргументов по умолчанию
Продвинутые методы предупреждения
import warnings
def deprecated_function(param=None):
warnings.warn("This function is deprecated", DeprecationWarning)
## Function implementation
Стратегии обработки ошибок
def robust_function(required_param, optional_param=None):
if required_param is None:
raise ValueError("Required parameter cannot be None")
optional_param = optional_param or []
return optional_param
Отладка и интроспекция
def inspect_defaults(func):
import inspect
signature = inspect.signature(func)
for param_name, param in signature.parameters.items():
print(f"{param_name}: {param.default}")