在python中检查函数的参数类型

在python中检查函数的参数类型,python,function,parameters,scope,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 (calculate

在第一个例子中,我意识到这是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"
“回溯(最近一次呼叫最后一次):
文件“”,第1行,在
类型(do_plus(a、b))
名称错误:未定义名称“a”
我对此感到困惑,当然我已经在def do_plus后面的括号中定义了a和b


我想要参数类型的原因是要进行抽查,即检查类型,如果类型不正确,则会引发类型错误,遗憾的是,我在第一个关卡上失败了,似乎:(

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


这些变量,
a
b
,是函数的本地变量,仅在函数运行时存在。函数返回后,这些变量就没有意义。如果要打印任何涉及这些变量的内容,请向函数添加代码来执行此操作。

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


这些变量,
a
b
,是函数的局部变量,仅在函数运行时存在。一旦函数返回,它们就没有任何意义。如果要打印任何涉及这些变量的内容,请向函数添加代码。在代码变量a中,b在方法
do的局部范围内_加上

为了更好地理解它,让
在方法内部打印(键入(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
<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
被传递一个值,该值是其浮点值、int值还是布尔值。
b
将是该变量的数据类型

只有当
b
未传递值时,我们才能100%确定
b
是方法
do\u plus
中的一个int

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

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

<class 'int'>
<class 'float'>
a=10
印刷品(a型)
a=10.1
印刷品(a型)

当变量
a
被分配一个int时,它的数据类型是int。当它被分配一个float时,它的数据类型变为float。

在代码变量a中,b在方法
的局部范围内

为了更好地理解它,让
在方法内部打印(键入(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
<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
被传递一个值,该值是其浮点值、int值还是布尔值。
b
将是该变量的数据类型

只有当
b
未传递值时,我们才能100%确定
b
是方法
do\u plus
中的一个int

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

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

<class 'int'>
<class 'float'>
a=10
印刷品(a型)
a=10.1
印刷品(a型)

当变量
a
被分配一个int时,它的数据类型是int。当它被分配一个float时,它的数据类型变为float。

我认为你的问题来自于对变量类型在Python中如何工作的误解

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

在python中,方法参数不是强类型的。你不能仅仅通过查看签名就知道方法需要什么类型!我假设你来自一种静态类型的语言,在这种语言中,你可以使用反射或类似的技巧来检查为方法声明的参数,但是python中不存在这样的功能,因为它不会使se.例如,我可以这样做:

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'
请注意,在最后一行中,投诉不是“您不能使用这些参数调用此方法”,而是“我不知道如何计算
3+”字符串“
”。如果查看堆栈跟踪,它将投诉
do\u plus
中的行,这表示执行成功地进入了函数

因此,由于无法从函数外部键入check,因此必须在函数内部键入check。可以使用
isinstance
内置函数执行此操作:

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
这是因为Python的一条核心准则:“请求原谅比获得许可更好。”与其检查自己是否能做些什么,不如尝试去做并处理失败

其他注释 你写
type(doplus(a))
的方式告诉我你认为
type
是某种关键字。事实并非如此,
type
是一个函数。实际上,它不仅仅是一个函数,但它仍然是一个函数。你可以写

type(type)
>>> <type 'type'>
类型(类型)
>>> 
这将导致您得出结论,类型实际上是一种类型!类型
类型
!这一切很快就会变得非常混乱,但关键是,在Python中,很少有单词被保留为关键字。在其他语言中,您会看到的大多数关键字功能都是通过内置函数实现的

阿迪