|
22 | 22 | from ._compat import ( |
23 | 23 | PY_3_8_PLUS, |
24 | 24 | PY_3_10_PLUS, |
| 25 | + PY_3_11_PLUS, |
25 | 26 | _AnnotationExtractor, |
26 | 27 | _get_annotations, |
27 | 28 | get_generic_base, |
@@ -2705,28 +2706,27 @@ def __init__(self, converter, *, takes_self=False, takes_field=False): |
2705 | 2706 | self.takes_self = takes_self |
2706 | 2707 | self.takes_field = takes_field |
2707 | 2708 |
|
2708 | | - self._first_param_type = _AnnotationExtractor( |
2709 | | - converter |
2710 | | - ).get_first_param_type() |
| 2709 | + ex = _AnnotationExtractor(converter) |
| 2710 | + self._first_param_type = ex.get_first_param_type() |
2711 | 2711 |
|
2712 | | - self.__call__ = { |
2713 | | - (False, False): self._takes_only_value, |
2714 | | - (True, False): self._takes_instance, |
2715 | | - (False, True): self._takes_field, |
2716 | | - (True, True): self._takes_both, |
2717 | | - }[self.takes_self, self.takes_field] |
2718 | | - |
2719 | | - def _takes_only_value(self, value, instance, field): |
2720 | | - return self.converter(value) |
2721 | | - |
2722 | | - def _takes_instance(self, value, instance, field): |
2723 | | - return self.converter(value, instance) |
2724 | | - |
2725 | | - def _takes_field(self, value, instance, field): |
2726 | | - return self.converter(value, field) |
| 2712 | + if not (self.takes_self or self.takes_field): |
| 2713 | + self.__call__ = lambda value, _, __: self.converter(value) |
| 2714 | + elif self.takes_self and not self.takes_field: |
| 2715 | + self.__call__ = lambda value, instance, __: self.converter( |
| 2716 | + value, instance |
| 2717 | + ) |
| 2718 | + elif not self.takes_self and self.takes_field: |
| 2719 | + self.__call__ = lambda value, __, field: self.converter( |
| 2720 | + value, field |
| 2721 | + ) |
| 2722 | + else: |
| 2723 | + self.__call__ = lambda value, instance, field: self.converter( |
| 2724 | + value, instance, field |
| 2725 | + ) |
2727 | 2726 |
|
2728 | | - def _takes_both(self, value, instance, field): |
2729 | | - return self.converter(value, instance, field) |
| 2727 | + rt = ex.get_return_type() |
| 2728 | + if rt is not None: |
| 2729 | + self.__call__.__annotations__["return"] = rt |
2730 | 2730 |
|
2731 | 2731 | @staticmethod |
2732 | 2732 | def _get_global_name(attr_name: str) -> str: |
@@ -2948,8 +2948,12 @@ def pipe_converter(val, inst, field): |
2948 | 2948 | if t: |
2949 | 2949 | pipe_converter.__annotations__["val"] = t |
2950 | 2950 |
|
| 2951 | + last = converters[-1] |
| 2952 | + if not PY_3_11_PLUS and isinstance(last, Converter): |
| 2953 | + last = last.__call__ |
| 2954 | + |
2951 | 2955 | # Get return type from last converter. |
2952 | | - rt = _AnnotationExtractor(converters[-1]).get_return_type() |
| 2956 | + rt = _AnnotationExtractor(last).get_return_type() |
2953 | 2957 | if rt: |
2954 | 2958 | pipe_converter.__annotations__["return"] = rt |
2955 | 2959 |
|
|
0 commit comments