目前碰到两个比较坑的地方,记录一下。
1.指定返回值
如以下代码段
def str_test() -> str:
return 10
python在运行的过程中,虽然我们指定了返回值类型,但是即使我们返回的是与返回值类型截然不同的类型,也不会抛出异常。但是当你编译成pyd以后,就会发生错误。究其原因,还是因为编译的过程是先把python语言转换成c语言,但是c语言对返回值类型是有严格规定的,虽然可以编译成功,但是运行过程中有可能出现无法排查到的错误,特别是没有添加日志打印的情况下,更加难以排查。
2.编译器位置参数
def deco(test):
def get_func(func):
def get_param(*args, **kwargs):
print("-------deco----------")
ret = func(*args, **kwargs)
print(test)
return ret
return get_param
return get_func
@deco(test='test is test')
def str_test(test2):
print(test2)
return 10
str_test(test2='test is test2')
又是一个踩坑的地方。在python中,这样的表达形式是完全没有问题的,但如果我们编译成pyd,pyd可以识别str_test中的关键字参数,却无法正确识别deco中的关键字参数。这可能也会导致抛出一些不易察觉的异常,特别是没有打印的情况下。解决方案就是不要使用关键字参数,使用位置参数传参即可。