2014-10-02 56 views
0

如果我想确保某些变量是函数输入参数中的某些类型的数据,我该如何检查它“Python的”?什么是Pythonic方法来确保某个类型或参数正确传递到函数/类中?

例如,这是你应该这样做的方式吗?

def test1(int1): 
    if type(int1) == int: 
     int1 = int1 + 4 
    else: 
     raise(RuntimeError) 
    return int1 

我确定有人问过这个问题,但我真的不知道要搜索什么。

附录问题:函数注释如何发挥所有这一切?

+0

https://docs.python.org/2/library/functions.html#isinstance – Jasper 2014-10-02 16:12:08

回答

1

那么,Python的人喜欢说请求宽恕比请求许可更容易(EAFP)。也许是这样的:

def test1(int1): 
    try: 
    int1 = int1 + 4 
    except TypeError: 
    raise RuntimeError 
    return int1 

只要尝试一下,并捕捉错误,如果失败。

+1

但是,如果你正在做的是重新认识错误,然后穿上”不要尝试 - 除了一切; Python已经为你提出了一个错误。如果你想在发生异常时做一些非功能性的事情,比如日志记录,那么在一个装饰器中执行 - 让函数的实现尽可能干净。 – PaulMcG 2014-10-02 16:31:04

3

我不会检查参数的类型。 Python会引发错误,只有当它不能处理你传递的对象和int对象4之间的加成:

>>> def test1(int1): 
...  return int1 + 4 
... 
>>> test1(1) 
5 
>>> test1(1.5) 
5.5 
>>> test1('a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in test1 
TypeError: cannot concatenate 'str' and 'int' objects 

如果你想提高不同的错误,赶上TypeError

def test1(int1): 
    try: 
     return int1 + 4 
    except TypeError: 
     raise RuntimeError 
+0

大多数人让用户知道如何记录该功能的“标准”方式到底是什么?您是否亲自说过,在函数的文档字符串中写入参数类型?你使用注释吗?你如何向你的用户(以及你未来的自我)传达什么样的论据应该是正确的? – johnzilla 2014-10-02 16:18:35

+0

@johnzilla,如果你使用Python 3.x,你可以使用[Function Annotation](http://legacy.python.org/dev/peps/pep-3107/)。否则,docstring。 – falsetru 2014-10-02 16:27:29

1

如果你真的想请检查arg类型是否使用pythonic方式isinstance

def test1(int1): 
    if is instance(int1, int): 
     int1 = int1 + 4 
    else: 
     raise(RuntimeError) 

但是,作为@falsetru,也不想检查类型。 Python已经做得很好。

此外,我会使用tryexception来改变流程,而不是增加错误。

0

不确定这是否正确。但是你尝试这样的: -

def test1(int1): 
    try: 
     int1 = int1 + 4 
    except: 
     raise(RuntimeError) 

    return int1 
相关问题