1

当将 ctypes 与我不熟悉的库一起使用时(在这种特定情况下,Windows API),我倾向于非常积极地检查每个小步骤是否存在故障,因为 Windows API 只是返回 Null,而不是抛出任何类型的错误。

所以,我有很多看起来像这样的行:

myVariableName = windll.user32.SomeWinAPIFuncThatReturnsZeroIfItFails()
if not myVariableName: print "Failed to create myVariableName"

我在找出代码时重复了无数次。

如果我可以将上面的检查包装到一个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

当然,我可以手动传入一个变量名字符串,但是为了简洁和样板的缘故,我可以只传入单个变量名就很酷了。

希望这是有道理的!

4

2 回答 2

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
于 2013-09-10T15:48:43.140 回答
1

简短而甜蜜的是:你不能(真的)传递变量,只能传递值。要传递一个变量,你必须传递它的名字和它的上下文。

这通常意味着您已经知道名称,因此您可以只传递名称,或者直接引用变量。

据我所知,在您的实际用例中,您实际上只是在检查值。您可以将该值传递给函数,没问题(如果需要,也可以传递名称 - 您静态地知道名称)。

于 2013-09-10T15:50:03.397 回答