Pythonのお勉強 Part75 (921レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
459
(7): (ワッチョイ c74b-oU0i) 07/15(火)22:25 ID:87Shwf9/0(1) AAS
すいません、パイソンを勉強中なのですがわからないところがあって1点質問さしてください
キーワード専用引数を条件によって与えたり与えなかったりするにはどうすればいいんでしょうか
無論
if True:
hoo(hoge=3)
else:
hoo(hoge=3, fuga=21)
省1
460
(2): (ワッチョイ ca67-AbPb) 07/16(水)00:25 ID:0/7fxfRI0(1/2) AAS
>>459
辞書アンパックでググると幸せになれるかもしれない
461: (ワッチョイ ca67-AbPb) 07/16(水)00:26 ID:0/7fxfRI0(2/2) AAS
>>459
辞書アンパックでググると幸せになれるかもしれない
466: (ワッチョイ 0d7c-YjA1) 07/18(金)18:45 ID:u+VO7eGe0(1) AAS
>>459
三項演算子使う。TrueのところがxがTrueという場合
def hoo(hoge, fuga):
 print(hoge, fuga)

x=True
hoo(hoge=3, fuga=21 if not x else None)
467: (ワッチョイ 9360-mivq) 07/18(金)19:36 ID:NjJf0MuU0(1) AAS
引数としてNoneを渡すのが引数なしと同じ意味になるかどうかは関数の仕様に依存するんじゃない? 
三項演算子を使うなら
hoo( hoge = 3 ) if x else hoo( hoge = 3, fuga = 21 )
の方が無難な気がする。ただ、これは>>459と本質的に変わらないし、459と比べて可読性がどうかは微妙なところ。何回も繰り返すのでできるだけ少ない行数で書きたいとかじゃなければ、結局、459の書き方が一番分かりやすいんじゃないかなぁ。

関数側に変更を加えてもいいなら>>460の指摘するとおり可変長キーワード引数を使うのもありだけど、関数内部でhoge, fuga以外のキーが使われないことからすると、個人的にはちょっと抵抗があるかな。
475
(2): (ワッチョイ d010-mivq) 07/18(金)23:43 ID:bJpxei9t0(3/3) AAS
関数hooの内容はブラックボックスにしておいた方が本質的な議論になるのは確かだと思うけど、可変長キーワード引数を使うのは(一般論としては)やっぱり抵抗感があるんだよね。

関数hooのその可変長キーワード仮引数は、hogeをキーとして持ち、さらにオプションでfugaもキーとして持つことができる辞書ということになるけど、そのことはコメントかリファレンスにでも書いておかないと関数のユーザー側からは分からないよね。普通、関数の仮引数に可変長キーワード引数がある場合、ユーザー側は任意のキーワード引数が渡せるものだと想定するものものだと思うんだが。任意のキーワード引数が渡せるわけではないこと(渡せるキーワード引数が一定範囲に限定されていること)を示唆するためにkwargsに代えて別の名前を使うことも考えられるけど、hoge_fugaみたいな仮引数名にするくらいなら素直に>>459で書いた方がずっと分かりやすいのではないかと思う。
hogeとfugaが何らかの設定項目のようなもので、可変長キーワード引数としてsettingsみたいな名前を使うのがぴったりくるようなシチュエーションなら良いと思うんだけどね。
481
(1): (ワッチョイ 9360-mivq) 07/19(土)09:53 ID:RatjLwY90(1) AAS
>>479
スマンが、値Noneがデフォルト値として適切なケースならそれでもいいけど、一般的にそうとはいえないという点は、数値0と同じだと思う。
とはいえ、>>459に対する一般的な回答とはいえなくても、個別のケースを見れば何らかの適切なデフォルト値(多くの場合は、数値0, 1, None, 空文字烈のどれかでカバーできるんじゃないかと思う)を見つけられることが多いと思うから、実践的にはそれで十分と言えるかもしれない。

ただ、そもそも論として、複数の実引数を1つの辞書にまとめ、関数に渡すときに**でアンパックするという方法論は、本質的には場合分けを行う場所を移しているだけだよね。475末尾のsettingsのように、1まとまりのものと観念できるような場合にはともかく、一般論としては>>459と比べて分かりやすくなっているとはいえないと思うよ(辞書の名前という余分な情報が増える分だけ、読む側の負荷が増えるだけなのでは)。
485: (ワッチョイ d401-1hpD) 07/19(土)11:21 ID:GfjIQpqe0(1) AAS
>>481
分岐が必要なキーワード引数が1つだけなら>>459のように単純なif-elseのほうが分かりやすいと思うが数が増えてくると辞書を使うやり方のほうが分かりやすくなることが多い

ちゃんとしたプログラムならBuilderパターン使って辞書を隠蔽したAPIを用意するけど内部構造は>>479と同じ
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.031s