检查python

时间:2016-12-09 18:25:48

标签: python function parameters scope

在第一个例子中,我知道这是Python社区内的争用来源,即类型检查表明代码不良等等。但是,这是我学习经历的一部分,我想要另一个我的Python工具集中的技能。

def do_plus(a,b):
    result=a+b
    return result
calculated_result=do_plus(12,34567)
print (calculated_result)

calculated_result=do_plus(12,34567)
print (calculated_result)

现在,当我尝试:

type(calculated_result) 
type (do_plus)

我分别得到了int和function。

type (do_plus(a))

以上结果:

"Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    type (do_plus(a,b))
NameError: name 'a' is not defined"

我对此感到困惑,我确实在def do_plus之后在括号内定义了a和b?

我想要参数类型的原因是进行抽查,即检查类型,如果不正确,则引发TypeError,遗憾的是,我在第一道障碍中失败了:(

3 个答案:

答案 0 :(得分:1)

在您的代码变量中,a,b在方法do_plus的本地范围内。

要理解它,最好在方法中使用print(type(a))

def do_plus(a, b):
    print(type(a), type(b))
    result = a + b
    return result

所以如果我打电话给do_plus(1, 2)输出是:

<class 'int'> <class 'int'>
3

但如果我打电话给do_plus(1.1, 2.0)输出是:

<class 'float'> <class 'float'>
3.1

您看,a,b的类型不存在,因为未定义a和b。它们仅被声明为变量。

当调用方法并且a传递一个浮点数时,它变成一个浮点数。当a传递一个int时,它变为int。

另一种情况是我们定义b=2

def do_plus(a, b=2):
    print(type(a), type(b))
    result = a + b
    return result

这里,如果b传递一个值,它的float或int或boolean值。 b将是该变量的数据类型。

只有当b未传递值时,我们才能100%确定b是方法do_plus中的int

这是python的核心部分。理解它的一个好方法是这段代码:

a = 10 
print(type(a))
a = 10.1 
print(type(a))

<class 'int'>
<class 'float'>

当变量a被赋值为int时,其数据类型为int。当它被赋值为float时,其数据类型变为float。

答案 1 :(得分:1)

我认为您的问题来自于对Python中变量类型的工作原理的误解。在行

type(do_plus(a))

抱怨a未被定义的原因是因为它没有查看参数a,它正在寻找一个名为a的变量它试图传递给函数。

在python中,方法参数不是强类型的。通过查看签名,您无法知道方法所期望的类型!我假设您来自静态类型语言,您可以使用反射或类似技巧来检查为方法声明的参数,但python中不存在这样的功能,因为它没有意义。例如,我可以这样做:

do_plus(1, 2) # parameters are both `int`
>>> 3
do_plus(1.1, 2.2) # parameters are both `float`
>>> 3.3
do_plus("string1", "string2") # parameters are both `str`
>>> "string1string2"
do_plus("string", 3) # one parameter is `str`, one is `int`
>>> "string3"
do_plus(3, "string")
>>> TypeError: unsupported operand type(s) for +: 'int' and 'str'

请注意,在最后一行,投诉不是&#34;您不能使用这些参数调用此方法&#34;,投诉是&#34;我不是知道如何计算3 + "string"&#34;。如果您查看堆栈跟踪,它会抱怨 {/ 1>}内的行,这表示执行已成功输入该函数。

因此,由于您无法从函数外部进行类型检查,因此您必须在内部键入check。您可以使用do_plus内置函数执行此操作:

isinstance

这是因为Python的核心指导原则之一:&#34;最好是请求宽恕而不是许可。&#34;您应该尝试这样做并处理失败,而不是检查您是否可以执行某些操作。

其他说明

您撰写def do_plus(a, b): if not isinstance(a, int) or not isinstance(b, int): raise TypeError("do_plus only accepts ints") return a + b 的方式向我建议您认为type (doplus(a))是某种关键字。情况并非如此,type函数。实际上,它不仅仅是一个功能,但它仍然是一个功能。你可以写

type

这会让您得出结论type(type) >>> <type 'type'> 实际上是类型!类型为type!这一切都很快变得非常混乱,但重点是,在Python中实际上保留了很少的单词作为关键字。您在其他语言中看到的大部分功能都是通过内置函数完成的。

此外,我看到你已经理解了这一点,但通常不是检查你想要尝试做某事的类型,如果它有效,那就赶紧吧!这就是 duck typing 的美妙之处,这就是“如果它看起来像一只鸭子而且像鸭子一样嘎嘎叫,它就是一只鸭子&#34;”。您应该假设人们传递给您的函数的任何参数都能够支持您尝试对它们执行的操作;通过这种方式,人们可以传递支持相同操作的其他对象,理论上,他们可以得到合理的结果。它是一种推理方法的逻辑而不是实现的方法;问题应该是&#34;我做对了吗?&#34;不是&#34;这样做是对的吗?&#34;

希望这会对你有所帮助。 Python是一种非常灵活的,非常灵活的语言,但它要求你的思考方式与其他语言的思维方式不同。

答案 2 :(得分:0)

您的问题与检查参数类型无关。这完全是关于变量范围的。

这些变量ab是函数的本地变量,仅在函数运行时才存在。一旦函数返回,它们就没有意义了。如果要打印涉及这些变量的任何内容,请将代码添加到函数中以执行此操作。