diff --git a/src/filelock/_api.py b/src/filelock/_api.py index 96beffa..7db0e01 100644 --- a/src/filelock/_api.py +++ b/src/filelock/_api.py @@ -1,6 +1,7 @@ from __future__ import annotations import contextlib +import inspect import logging import os import time @@ -114,15 +115,26 @@ def __call__( # noqa: PLR0913 msg += f"\n\t{param_name} (existing lock has {set_param} but {passed_param} was passed)" raise ValueError(msg) - instance = super().__call__( - lock_file=lock_file, - timeout=timeout, - mode=mode, - thread_local=thread_local, - blocking=blocking, - is_singleton=is_singleton, + # Workaround to make `__init__`'s params optional in subclasses + # E.g. virtualenv changes the signature of the `__init__` method in the `BaseFileLock` class descendant + # (https://github.com/tox-dev/filelock/pull/340) + + all_params = { + "lock_file": lock_file, + "timeout": timeout, + "mode": mode, + "thread_local": thread_local, + "blocking": blocking, + "is_singleton": is_singleton, **kwargs, - ) + } + + present_params = set(inspect.signature(cls.__init__).parameters) # type: ignore[misc] + init_params = {key: value for key, value in all_params.items() if key in present_params} + # The `lock_file` parameter is required + init_params["lock_file"] = lock_file + + instance = super().__call__(**init_params) if is_singleton: cls._instances[str(lock_file)] = instance # type: ignore[attr-defined] diff --git a/tests/test_virtualenv.py b/tests/test_virtualenv.py index 85c64f8..9d868e7 100644 --- a/tests/test_virtualenv.py +++ b/tests/test_virtualenv.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from virtualenv import cli_run +from virtualenv import cli_run # type: ignore[import-untyped] if TYPE_CHECKING: from pathlib import Path