from datetime import datetime
def get_weather(**kwargs):
now = kwargs.get("now", None)
if now is None:
now = datetime.now()
location_name = kwargs.get("location_name", None)
if location_name is None:
location_name = "東京都" # ... なんとかしてここは住所を取得する。
# ...
# ...
return "雷雨"
使い方は以下のとおり。
public_otasuke_info.py
from datetime import datetime, timedelta
from weather import get_weather
def get_general_location_info():
now = datetime.now() + timedelta(hours=6)
location_name = "奈良県"
weather = get_weather(now=now, location_name=location_name)
return weather # "雷雨"
if __name__ == "__main__":
print(get_general_location_info())
jinoseさんの投稿
(投稿ID: 5564)
AIユーザさんのコメント
(コメントID: 8441)
こんにちは。仮引数のアンパックについて、もう少し詳しく説明しますね。
仮引数のアンパックは、関数を定義する際に使います。
関数を呼び出す側の実引数のアンパックは、リストや辞書を展開して関数に渡すものでした。
一方、仮引数のアンパックは、関数の定義側で、渡されてくるであろう実引数をまとめて受け取るためのものです。
仮引数でのアンパックには2つのパターンがあります。
1つは、位置引数を任意の数だけ受け取るパターンです。
関数定義時に、仮引数名の前に * を1つつけます。
こうすることで、関数呼び出し時に渡された位置引数を、その仮引数名のタプルとして受け取れます。
もう1つは、キーワード引数を任意の数だけ受け取るパターンです。
関数定義時に、仮引数名の前に ** を2つつけます。
こうすることで、関数呼び出し時に渡されたキーワード引数を、その仮引数名の辞書として受け取れます。
これらは同時に使うこともできます。
その場合は、位置引数用の *args を先に、キーワード引数用の **kwargs を後に書きます。
仮引数のアンパックを使えば、関数の呼び出し側が任意の数の引数を渡せるようになり、関数の汎用性が高まります。
ライブラリ関数などでよく使われるテクニックです。
もしまだわかりにくい点などあれば、遠慮なく質問してくださいね。一緒に理解を深めていきましょう。
小川 慶一さんのコメント
(コメントID: 8444) 添付ファイルのダウンロード権限がありません
大きなプログラムを書いていると、どうしても、あとから「あ、あの関数を、あんな引数もこんな引数も受け取れるように直したいな」と思うような仕様変更が生じます。
そのとき、それらの引数を追加してもよいのですが、そのあとまたさらに同じようなことを思うかもしれない。そんなとき、 *args, **kwargs で書いておくと、修正が少なくて助かります。
例:
元の関数は、現在の、このプログラム実行している地域のお天気を教えてくれるものだとします。
weather.py
これはこれで、別のプログラムから運用していたとします。
my_otasuke_info.py
でも、一般公開用に、場所と日時とを指定すると、その場所のその日時での天気を表示するようにしよう!と思ったする。
そういうとき、たとえば、元の weather.py を以下のように直します。
weather.py
使い方は以下のとおり。
public_otasuke_info.py
上記の要領でなおしていくならば、 public_otasuke__info.py での仕様変更のために、 my_otasuke_info の (*) の部分を書き直さないで済みます。
しかし、もしも以下のとおりにやってしまったならば、my_otasuke_info.py (*) の部分をなんとかして書き直さなくてはならなくなる。
weather.py
今はまだ get_weather の呼び出し元が2しかないし、そのうち1つを直すだけだから、「まあ、面倒くさいけどやるか」でやれますが...。
これが、20個くらいの呼び出し元があるとなると、...もうそんな修正したくない。
そんなときに、仮引数を *args, **kwargs とするだけで済むならば、開発者としてはとてもありがたいのです。
添付の .zip ファイルをDLして研究してください。
そしてもちろん、自分でいちからコードを書いて試すことも忘れずに!
小川 慶一さんのコメント
(コメントID: 8445)
理解先行で進めようとせず、とにかく多量に書くことです。たくさん書いて「めんどくせーなー」と思うような体験をいろいろしてからこの話を読み返すと、「あ、なるほど。そりゃ助かるわ」と思えるかと思います。