2015-11-25 72 views
2

说我有这将返回基于一个字符串输入参数的一类,像这样一个功能:动态返回类型与PEP 484

def foo(bar): 
    if bar == 'baz': 
     return Baz() 
    else: 
     return Buz() 

在这种情况下,无论是BazBuzBiz子类,但每个都有许多不同的函数,所以将返回类型声明为超类并不特别有用。假设我不在乎我的.pyi文件是否可怕,是否有任何方法可以声明为给定输入返回了哪个子类?

+0

每个变量都是在Python中动态输入的,所以如果你真的需要知道变量是什么类型的话,可以使用'type(...)'。就像'type(“example string”)== str'将会是'True'。 –

+1

我明白,我的目的是为这个方法和它返回的类提供IDE支持。 –

+0

https://github.com/ambv/typehinting和https://www.python.org/dev/peps/pep-0484/ –

回答

2

我不认为你可以很特异,有什么可以做,虽然是声明的东西返回两个不同的类型,像这样:

from typing import Union 

class Bar: 
    pass 
class Baz: 
    pass 

def foo(garply : str) -> Union[Bar, Baz]: 
    pass 

看看这里的文档: https://www.python.org/dev/peps/pep-0484/#union-types

并以合理的简短概述这里: http://blog.jetbrains.com/pycharm/2015/11/python-3-5-type-hinting-in-pycharm-5/

你可能会更好思考如何避免这种有问题的设计,而不是如何完美用类型提示记录它。

+0

我很感激帮助!这可能是一种可能性。这个设计是在运行时自动生成类的结果,所以没有太多的事情要做,以避免它。 –

+0

我想如果你在运行时产生东西(或者如果没有,甚至是!),将输入清晰地耦合到特定类型的输出的明显方式是具有单独的功能。它几乎听起来像你想要的类型提示来描述语义,他们可能不会太好。 – pvg