如何使用传递给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
我可以将其设置为RuntimeValueProvider
或StaticValueProvider
并显式测试:
type(my_value_provider.type) == str
其他人是如何做到这一点的?我在这里什么也没看到:https://beam.apache.org/documentation/sdks/python-type-safety
我最终创建了一个包装器值提供者,如下所示,欢迎发表意见/评论。
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()
我不认为有办法通过python的类型检查来强制执行这一点,尽管您可以随时添加自己的运行时类型检查来潜在地改进错误消息。
或者,您可以通过使用Flex模板来避免使用ValueProvider。
问题内容: 在PEP 484中 ,包含模块的类型提示已添加到Python 3中。在Python 2中有什么方法可以做到这一点?我能想到的就是有一个装饰器来添加到检查类型的方法中,但这将在运行时失败,并且不会像提示所允许的那样被较早地捕获。 问题答案: 根据 Python 2.7的建议语法和 定义类型提示的PEP 484中的 跨代码 ,存在与Python 2.7兼容的另一种语法。但是,它不是强制性的
问题内容: 我想向函数添加类型提示,该函数将接受带有方法的任何对象。例如,在 我不想限制为特定类型,例如或。只要它支持,它就是的适当参数。如何在没有不必要限制的情况下注释其类型? 编辑:显然,PyCharm可以在许多常见情况下得出适当的提示,但在我的实际用例中却不能。我无法发布代码,因为它是用于工作的,而且我找不到PyCharm失败的非专有最小示例。无论如何,原始问题不会引用PyCharm,它仍然
问题内容: 我有一个看起来像这样的函数: 在成功运行此函数时,我应该得到一个,但是如果出现错误,我应该得到一个-可以,因为我在另一个函数中处理了它。 我的函数第一行看起来像这样: 我的问题是:我应该在类型提示中提及错误吗? 问题答案: 类型提示不能说任何有关异常的信息。它们完全超出了该功能的范围。但是,您仍然可以在文档字符串中记录异常。 从 PEP 484-类型提示 : 例外情况 没有提出用于列出
问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,
问题内容: 类型提示是Python 3.5中讨论最多的功能之一。 的一个例子类型提示中提到的这篇文章和这一个,同时还提负责任地使用类型提示。有人可以解释更多有关它们的信息,何时使用以及何时不使用? 问题答案: 我建议阅读PEP 483和PEP 484和观看该演示由Guido的类型提示。 简而言之:类型提示实际上是单词的意思,你可以提示所使用的对象的类型。 由于Python 的动态特性,推断或检查所
有没有办法在类中定义参数的类型,以便该类型引用自身? 例如,以下内容不会运行: 错误: