1

私がよく知らないライブラリ (この特定のケースでは Windows API) で ctypes を使用する場合、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

もちろん、変数名の文字列を手動で渡すこともできますが、簡潔さとボイラープレートのために、1 つの変数名だけを渡すことができると便利です。

うまくいけば、それは理にかなっています!

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 に答える