Skip to content

TypeDecorator.process_bind_param only possible return value is Optional[str], but this doesn't work for binary types #214

@synic

Description

@synic

Probably doing something wrong here, but I can't figure out how to make this work:

class EncryptedType(TypeDecorator):
    impl = LargeBinary

    def __init__(self, engine: EncryptionEngine, **kwargs: Any) -> None:
        super().__init__(**kwargs)
        self.engine = engine

    def process_bind_param(self, value: Optional[str], dialect: Dialect) -> Optional[str]:
        if value is None:
            return None
        return self.engine.encrypt(value).decode()  # convert to string, but I'd rather not

    def process_result_value(self, value: Optional[bytes], dialect: Dialect) -> Optional[str]:
        if value is None:
            return None
        return self.engine.decrypt(value)

Trying to insert data into a column results in an error like this:

StatementError: (builtins.TypeError) memoryview: a bytes-like object is required, not 'str'

Simply returning self.engine.encrypt(value) without the .decode() to convert to a string works, but then mypy complains that Return type "Optional[bytes]" of "process_bind_param" incompatible with return type "Optional[str]" in supertype "TypeDecorator"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions