Как использовать подсказки типов для типов значений ValueProvider, передаваемых в классы PTransform и DoFn?
class MyPTransform(beam.PTransform):
def __init__(self, my_value_provider: ValueProvider):
# How do I enforce my_value_provider has value_type of str
self.my_value_provider = my_value_provider
Я могу сделать это RuntimeValueProvider
или StaticValueProvider
и проверить это явно:
type(my_value_provider.type) == str
Как это делают другие? Я тут ничего не увидел: https://beam.apache.org/documentation/sdks/python-type-safety
Я не думаю, что есть способ обеспечить это с помощью проверки типов Python, хотя вы всегда можете добавить свою собственную проверку типов во время выполнения, чтобы потенциально улучшить сообщения об ошибках.
Кроме того, вы можете вообще не использовать ValueProvider, используя вместо этого Flex Templates.
Я закончил тем, что создал поставщика значений оболочки, например, мнения/комментарии приветствуются.
from typing import Generic, TypeVar
from apache_beam.options.value_provider import ValueProvider, StaticValueProvider, RuntimeValueProvider
T = TypeVar('T')
class TypedValueProvider(ValueProvider, Generic[T]):
"""
Providers a wrapper around beam's ValueProvider to allow specifying value type hints
"""
def __init__(self, value_provider: ValueProvider, value_type: Type[T]):
self.value_provider = value_provider
self.value_type = value_type
assert value_provider.value_type == value_type
def is_accessible(self):
return self.value_provider.is_accessible()
def get(self):
return self.value_provider.get()
if __name__ == '__main__':
svp = StaticValueProvider(str, 'blah')
dvp: TypedValueProvider[str] = TypedValueProvider(svp, str)
print(isinstance(dvp, ValueProvider))
assert 'blah' == dvp.get()
rvp = RuntimeValueProvider('key', str, 'default')
RuntimeValueProvider.set_runtime_options({'key': 'value'})
dvp: TypedValueProvider[str] = TypedValueProvider(rvp, str)
print(isinstance(dvp, ValueProvider))
assert 'value' == dvp.get()