はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
double splat引数 (Python)
def charge(sequence, pH, **kwargs):
# 略
class ElectrochemTest(unittest.TestCase):
def test_charge_calculations_str(self):
self.assertTrue(
abs(charge('AAA', 5.0,
pK={'H-': [(9., 1)], '-OH': [(8., -1)]},
pK_nterm={'H-': {'A': [(3., 1)]}})) < 0.01)
pK
やpK_nterm
って仮引数にないのですが、実は辞書のキーでした。
double splat引数 (Ruby)
def charge(sequence, pH, **kwargs)
# 略
end
class TestEctrochem < Minitest::Test
def test_charge_calculations_str
assert charge(
'AAA', 5.0,
'pK' => {'H-' => [[9.0, 1]], '-OH' => [[8.0, -1]]},
'pK_nterm' => {'H-' => {'A' => [[3.0, 1]]}}
).abs < 0.01
end
end
def charge(sequence, pH, **kwargs)
# 略
end
class TestEctrochem < Minitest::Test
def test_charge_calculations_str
assert charge(
'AAA', 5.0,
+ {
'pK' => {'H-' => [[9.0, 1]], '-OH' => [[8.0, -1]]},
'pK_nterm' => {'H-' => {'A' => [[3.0, 1]]}}
+ }
).abs < 0.01
end
end
def charge(sequence, pH, **kwargs)
# 略
end
class TestEctrochem < Minitest::Test
def test_charge_calculations_str
assert charge(
'AAA', 5.0,
+ **{
'pK' => {'H-' => [[9.0, 1]], '-OH' => [[8.0, -1]]},
'pK_nterm' => {'H-' => {'A' => [[3.0, 1]]}}
+ }
).abs < 0.01
end
end
{}なし
と{}あり
と**{}
の3つを書きましたが、この内{}あり
はエラーが発生するので、コントリビュートチャンスだそうです。
ArgumentError: wrong number of arguments (given 3, expected 2)
速度の検証
こちらの記事によりますと、double splat
は遅いらしいです。
minitest
の結果を参照しますと、レシーバ側はkwargs = {}
、呼び出し側は{}なし
が速そうです。Ruby 3
何?それっておいしいの?
**kwargs | kwargs = {} | |
---|---|---|
{}なし | 2736.8176 assertions/s | 3226.1533 assertions/s |
**{} | 3005.5192 assertions/s | 3190.0239 assertions/s |
メモ
- Python の double splat引数 を学習した
- 百里を行く者は九十里を半ばとす