mypy
предупреждает об отсутствующих типах возврата по умолчанию, поэтому вы можете явно отключить его:
$ mypy --no-warn-no-return spam.py
или отключить конкретную проверку только для конкретной строки:
def to_json(data: Dict, path: Optional[str] = None) -> Optional[str]: # type: ignore[return]
...
Однако ваша функция имеет разные типы возврата в зависимости от входа. Я бы добавил перегруженную подпись для обработки:
from typing import Dict, Optional, overload
# when path is provided, the function returns
@overload
def to_json(data: Dict, path: str) -> str: ...
# when path is not provided, the function returns None
@overload
def to_json(data: Dict) -> None: ...
# your actual impl
def to_json(data, path=None):
if path is None:
...