From a89c97a3e370bb9febcaef1db1cb196b06231135 Mon Sep 17 00:00:00 2001 From: Brian Maissy Date: Fri, 9 Oct 2020 14:11:23 +0300 Subject: [PATCH] add a __call__ stub to PyObject for mypy (#1849) Co-authored-by: Brian Maissy --- changes/1352-brianmaissy.md | 1 + pydantic/types.py | 5 +++++ tests/mypy/modules/success.py | 14 ++++++++++++-- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 changes/1352-brianmaissy.md diff --git a/changes/1352-brianmaissy.md b/changes/1352-brianmaissy.md new file mode 100644 index 0000000..f87b1cd --- /dev/null +++ b/changes/1352-brianmaissy.md @@ -0,0 +1 @@ +Add a `__call__` stub to `PyObject` so that mypy will know that it is callable diff --git a/pydantic/types.py b/pydantic/types.py index 6f60b31..79693dd 100644 --- a/pydantic/types.py +++ b/pydantic/types.py @@ -317,6 +317,11 @@ class PyObject: except ImportError as e: raise errors.PyObjectError(error_message=str(e)) + if TYPE_CHECKING: + + def __call__(self, *args: Any, **kwargs: Any) -> Any: + ... + class ConstrainedNumberMeta(type): def __new__(cls, name: str, bases: Any, dct: Dict[str, Any]) -> 'ConstrainedInt': # type: ignore diff --git a/tests/mypy/modules/success.py b/tests/mypy/modules/success.py index a2d5fde..0ba4ae9 100644 --- a/tests/mypy/modules/success.py +++ b/tests/mypy/modules/success.py @@ -5,10 +5,10 @@ Do a little skipping about with types to demonstrate its usage. """ import json import sys -from datetime import datetime +from datetime import date, datetime from typing import Any, Dict, Generic, List, Optional, TypeVar -from pydantic import BaseModel, NoneStr, StrictBool, root_validator, validate_arguments, validator +from pydantic import BaseModel, NoneStr, PyObject, StrictBool, root_validator, validate_arguments, validator from pydantic.fields import Field from pydantic.generics import GenericModel @@ -127,3 +127,13 @@ def foo(a: int, *, c: str = 'x') -> str: foo(1, c='thing') foo(1) + + +class MyConf(BaseModel): + str_pyobject: PyObject = Field('datetime.date') + callable_pyobject: PyObject = Field(date) + + +conf = MyConf() +var1: date = conf.str_pyobject(2020, 12, 20) +var2: date = conf.callable_pyobject(2111, 1, 1)