inspect.getargspec(function).args からの変数名のリストがあります。各リスト項目は、変数名の文字列です。引数変数の値が文字列かどうかを確認できるように、関数内からこれらの文字列名を使用する必要があります。
これが私が取り組んでいるものです
@staticmethod
def boyleslaw(p, V, k):
"""pV = k
p=pressure Pa, V=volume m^3, k=constant
substitute letter to solve for that value
return x"""
#sv = countvar(gasses.boyleslaw)
sv = 0
if p == 'p': sv += 1
if V == 'V': sv += 1
if k == 'k': sv += 1
if sv > 1:
raise ValueError('Too Many Variables')
if p == 'p' and sv == 1:
x = k/V
return x
elif V == 'V' and sv == 1:
x = k/p
return x
elif k == 'k' and sv == 1:
x = p*V
return x
@staticmethod
def charleslaw(V, T, k):
"""V/T = k
V=volume m^3, T=temperature K, k=constant
substitute letter for value to solve for
return x"""
#sv = countvar(gasses.charleslaw)
sv = 0
if V == 'V': sv += 1
if T == 'T': sv += 1
if k == 'k': sv += 1
if sv > 1:
raise ValueError('Too Many Variables')
if V == 'V' and sv == 1:
x = k*T
return x
elif T == 'T' and sv == 1:
x = V*k
return x
elif k == 'k' and sv == 1:
x = V/T
return x
このプロセスをラップしたい
sv = 0
if V == 'V': sv += 1
if T == 'T': sv += 1
if k == 'k': sv += 1
if sv > 1:
raise ValueError('Too Many Variables')
引数をカウントし、各引数値が文字列であるかどうかを確認する独自のカウント変数関数に入れます。これまでのところ...次に壁+頭...
@staticmethod
def countvar(module):
"""Count number of Variables in args"""
vc = 0
alist = inspect.getargspec(module)
for i in alist.args:
if isinstance(i, str) == True:
vc += 1
return vc
alist.args の各項目は文字列であるため、値に関係なく、いずれかの関数で実行すると 3 が返されます。各変数の VALUE が文字列の場合にのみカウンターをインクリメントし、変数が複数ある場合は ValueError を発生させます。文字列 'p' を変数 p... に変換する方法
編集:明確化
boyleslaw(6886019.02, 1, k) #Solve for k
inspect.getargspec(boyleslaw).args
戻り値['p', 'V', 'k']
リストが欲しい[6886019.02, 1, 'k']
alist[0]
= 'p'
#文字列名を返す
return p
#変数値が必要
値 p が文字列の場合 (呼び出し時に解決する変数が選択された場合)、エラー処理のためにカウンターをインクリメントします
boyleslaw(6886019.02, 1, k)
エラーを発生させません
boyleslaw(6886019.02, V, k)
だろうraise ValueError('Too Many Variables')