当我使用带有我不熟悉的库的ctypes时(在这个特定的情况下,Windows API),我倾向于非常积极地检查每个小步骤的失败,因为Windows API只返回Null,而不是抛出任何类型错误。
所以,我有很多行看起来像这样:
myVariableName = windll.user32.SomeWinAPIFuncThatReturnsZeroIfItFails()
if not myVariableName: print "Failed to create myVariableName"
在重复编码时,我重复了一下kazzilion。
如果我可以将上面的检查包装到checkSuccess()
函数中,这将是非常好的,它只需要检查变量的名称。
的内容
def check_success(var_name):
if not var_name:
print "failed to create %s" % var_name # <-- but the actual variable name; not the value
sys.exit()
return True
当然,我可以手动传入变量名称的字符串,但是为了清洁和样板文件,我可以传递单个变量名称,这很酷。
希望这是有道理的!
答案 0 :(得分:2)
这里有足够的回溯吗?
myVariableName = windll.user32.SomeWinAPIFuncThatReturnsZeroIfItFails()
if not myVariableName: raise ValueError
当它被提升时,你会看到:
Traceback (most recent call last):
File "main.py", line 1, in <module>
my_function()
File "main.py", line 3, in my_function
if not myVariableName: raise ValueError
ValueError
您可以编写一个函数来帮助您:
def verify_non_zero(x):
if x == 0: raise ValueError
return x
然后:
myVariableName = verify_non_zero(windll.user32.SomeWinAPIFunc())
哪会给你回溯:
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
myVariableName = verify_non_zero(windll.user32.SomeWinAPIFunc())
File "<pyshell#6>", line 2, in verify_non_zero
if x == 0: raise ValueError
答案 1 :(得分:1)
简短而甜蜜的是:你不能(真的)传递变量,只能传递值。要传递变量,您必须传递其名称及其上下文。
这通常意味着您已经知道了名称,因此您可以直接传递名称,或直接引用该变量。
在您的实际用例中,据我所知,您实际上只是检查值。您可以将该值传递给函数,没问题(如果需要,也可以传递名称 - 您可以静态地知道名称)。