Python Apache beam ValueProvider 的类型提示

Python Type Hints for Apache beam ValueProvider

如何对传递给 PTransform 和 DoFn 的 ValueProvider 值类型使用类型提示 类?

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

我可以将其设为 RuntimeValueProviderStaticValueProvider 并明确测试:

 type(my_value_provider.type) == str

其他人是怎么做到的?我在这里没有看到任何东西:https://beam.apache.org/documentation/sdks/python-type-safety

我认为没有办法通过 python 的类型检查来强制执行此操作,尽管您始终可以添加自己的运行时类型检查以潜在地改进错误消息。

或者,您可以通过使用 Flex Templates 来避免使用 ValueProvider。

我最终像这样创建了一个包装器值提供程序,opinions/comments 欢迎。

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()