better function subclasses
This commit is contained in:
parent
f4cd0fc781
commit
879c070194
4 changed files with 14 additions and 12 deletions
|
|
@ -16,8 +16,9 @@ from ytdl_sub.script.types.resolvable import AnyTypeReturnable
|
|||
from ytdl_sub.script.types.resolvable import AnyTypeReturnableA
|
||||
from ytdl_sub.script.types.resolvable import AnyTypeReturnableB
|
||||
from ytdl_sub.script.types.resolvable import ArgumentType
|
||||
from ytdl_sub.script.types.resolvable import FunctionLike
|
||||
from ytdl_sub.script.types.resolvable import FunctionType
|
||||
from ytdl_sub.script.types.resolvable import Resolvable
|
||||
from ytdl_sub.script.types.resolvable import TypeHintedFunctionType
|
||||
from ytdl_sub.script.types.variable import FunctionArgument
|
||||
from ytdl_sub.script.types.variable import Variable
|
||||
from ytdl_sub.script.types.variable_dependency import VariableDependency
|
||||
|
|
@ -28,10 +29,7 @@ from ytdl_sub.utils.exceptions import StringFormattingException
|
|||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Function(VariableDependency, ArgumentType, ABC):
|
||||
name: str
|
||||
args: List[ArgumentType]
|
||||
|
||||
class Function(FunctionType, VariableDependency, ABC):
|
||||
@property
|
||||
def variables(self) -> Set[Variable]:
|
||||
"""
|
||||
|
|
@ -104,7 +102,7 @@ class CustomFunction(Function):
|
|||
raise StringFormattingException(f"Custom function {self.name} does not exist")
|
||||
|
||||
|
||||
class BuiltInFunction(Function, FunctionLike):
|
||||
class BuiltInFunction(Function, TypeHintedFunctionType):
|
||||
def validate_args(self) -> "BuiltInFunction":
|
||||
if not self.input_spec.is_compatible(input_args=self.args):
|
||||
raise FunctionArgumentsExceptionFormatter(
|
||||
|
|
|
|||
|
|
@ -116,10 +116,14 @@ class String(ResolvableT[str], Hashable, ArgumentType):
|
|||
pass
|
||||
|
||||
|
||||
class FunctionLike(NamedType):
|
||||
@dataclass(frozen=True)
|
||||
class FunctionType(ArgumentType, ABC):
|
||||
name: str
|
||||
args: List[ArgumentType]
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class TypeHintedFunctionType(FunctionType, ABC):
|
||||
@abstractmethod
|
||||
def output_type(self) -> Type[Resolvable]:
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ from typing import Type
|
|||
from typing import TypeVar
|
||||
from typing import Union
|
||||
|
||||
from ytdl_sub.script.types.resolvable import FunctionLike
|
||||
from ytdl_sub.script.types.resolvable import NamedType
|
||||
from ytdl_sub.script.types.resolvable import TypeHintedFunctionType
|
||||
from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments
|
||||
from ytdl_sub.script.utils.exceptions import UserException
|
||||
from ytdl_sub.script.utils.type_checking import FunctionInputSpec
|
||||
|
|
@ -90,7 +90,7 @@ class FunctionArgumentsExceptionFormatter:
|
|||
def __init__(
|
||||
self,
|
||||
input_spec: FunctionInputSpec,
|
||||
function_instance: FunctionLike,
|
||||
function_instance: TypeHintedFunctionType,
|
||||
):
|
||||
self._args = input_spec.args
|
||||
self._varargs = input_spec.varargs
|
||||
|
|
@ -115,7 +115,7 @@ class FunctionArgumentsExceptionFormatter:
|
|||
def highlight(self) -> IncompatibleFunctionArguments:
|
||||
received_type_names: List[str] = []
|
||||
for arg in self._input_args:
|
||||
if isinstance(arg, FunctionLike):
|
||||
if isinstance(arg, TypeHintedFunctionType):
|
||||
if is_union(arg.output_type()):
|
||||
# TODO: Move naming to separate function, deal with Union input naming
|
||||
received_type_names.append(
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ from typing import Union
|
|||
from typing import get_origin
|
||||
|
||||
from ytdl_sub.script.types.resolvable import ArgumentType
|
||||
from ytdl_sub.script.types.resolvable import FunctionLike
|
||||
from ytdl_sub.script.types.resolvable import FunctionType
|
||||
from ytdl_sub.script.types.resolvable import NamedType
|
||||
from ytdl_sub.script.types.resolvable import Resolvable
|
||||
from ytdl_sub.script.types.variable import Variable
|
||||
|
|
@ -30,7 +30,7 @@ def is_type_compatible(
|
|||
expected_arg_type: Type[Resolvable | Optional[Resolvable]],
|
||||
) -> bool:
|
||||
arg_type: Type[NamedType] = arg.__class__
|
||||
if isinstance(arg, FunctionLike):
|
||||
if isinstance(arg, FunctionType):
|
||||
arg_type = arg.output_type()
|
||||
elif isinstance(arg, Variable):
|
||||
return True # unresolved variables can be anything, so pass for now
|
||||
|
|
|
|||
Loading…
Reference in a new issue