あなたは、スイッチング機能は、すべてのそれの最初の引数、InstType_C
、キーワード引数を受け取る作ることができます。これにより、各呼び出しで渡す値を指定することができます。
これを説明するために、私はあなたのサンプルコードに適用しました。実際に実行可能なものを作るために、コードから除外されているものがいくつか追加されていますが、これはテスト目的のためだけです。
これは、それほど改善されていないように見えるかもしれませんが、テストのために、独自の名前を含む変数が定義されているためです。これは、各キーワード引数に同じ名前の変数の値が割り当てられているため、スイッチャー関数の呼び出しを長くしているため、実際の長さの2倍の長さになります。
すべてのテストコードでは、これは非常に長くて複雑に見えますが、目的の目的の利点を十分に理解していただければ幸いです。
PEP 8 - Style Guide for Python Code命名規則に従わないという事実も、構文強調表示SOが表示されたコードに適用されるので、「ビジー」に見えます。
# For testing define and create a class with methods to call.
# Each method will just print out the values of the arguments it was passed.
class Inst(object):
def FourTwenty(self, *args):
print('called FourTwenty({})\n'.format(args))
def SGMagprobe(self, *args):
print('called SGMagprobe({})\n'.format(args))
def TLS(self, *args):
print('called TLS({})\n'.format(args))
inst = Inst() # create instance for testing
# For testing create variables to pass as arguments, each variable will contain
# the variable's name as its value. i.e. some_variable = 'some_variable'.
arguments = [arg.strip() for arg in (
"raw_data_LP, maxcounts_C, Measurement_Min, Measurement_Max, "
"Measurement_Type, SG, Tank_Shape, area, dish, diameter, length, "
"Strapping_Table, Poly_Data, Tank_Number, LevelOffset").split(',')]
for arg in arguments:
globals()[arg] = arg
#### End of testing scaffold.
class AttrDict(dict):
"""Allows use of dot notation to access dictionary's contents."""
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
def Instrument_Type_Calcs_C(InstType_C, **kwargs):
kwargs = AttrDict(kwargs) # make them easier to access
switcher = {
'8AI': lambda: inst.FourTwenty(kwargs.raw_data_LP, kwargs.maxcounts_C,
kwargs.Measurement_Min,
kwargs.Measurement_Max, kwargs.Measurement_Type,
kwargs.SG, kwargs.Tank_Shape, kwargs.area, kwargs.dish,
kwargs.diameter, kwargs.length, kwargs.Strapping_Table,
kwargs.Poly_Data, kwargs.Tank_Number, kwargs.LevelOffset),
'Magprobe': lambda: inst.SGMagprobe(kwargs.raw_data_LP, kwargs.Tank_Shape, kwargs.area,
kwargs.dish, kwargs.diameter, kwargs.length,
kwargs.Strapping_Table, kwargs.Poly_Data,
kwargs.Tank_Number, kwargs.LevelOffset),
'TLS': lambda: inst.TLS(kwargs.raw_data_LP),
}
return switcher.get(InstType_C, lambda: None)()
volume = Instrument_Type_Calcs_C('8AI', raw_data_LP=raw_data_LP,
maxcounts_C=maxcounts_C, Measurement_Min=Measurement_Min,
Measurement_Max=Measurement_Max,
Measurement_Type=Measurement_Type, SG=SG,
Tank_Shape=Tank_Shape, area=area, dish=dish,
diameter=diameter, length=length,
Strapping_Table=Strapping_Table, Poly_Data=Poly_Data,
Tank_Number=Tank_Number, LevelOffset=LevelOffset)
volume = Instrument_Type_Calcs_C('Magprobe', raw_data_LP=raw_data_LP, SG=SG,
Tank_Shape=Tank_Shape, area=area, dish=dish,
diameter=diameter, length=length,
Strapping_Table=Strapping_Table, Poly_Data=Poly_Data,
Tank_Number=Tank_Number, LevelOffset=LevelOffset)
volume = Instrument_Type_Calcs_C('TLS', raw_data_LP=raw_data_LP)
デフォルトパラメータを使用してみましたか? 'Def Instrument_Type_Calcs_C(InstType_C、raw_data_LP = None、...)' –