質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

別の関数の変数を呼び出したい

kentaronagata
kentaronagata

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0グッド

0クリップ

186閲覧

投稿2023/01/25 01:19

前提

他の関数に入っている変数を呼び出したいのですがうまいこといきません。
ここに質問の内容を詳しく書いてください。

実現したいこと

現在、Googleアナリティクスからデータを引っ張ってきてスプレットシートに貼り付けるといったプログラムを作成しています。
以下のコードはday_startとday_endを指定してあげると期間内のデータを1日毎にデータを取得していくといった流れになっています。

python

1n = 0 2today = datetime.date.today() 3day_start = datetime.datetime.strptime(input("データ取得始めの日付を入力してください。(例:20230120)"),"%Y%m%d").date() 4day_end = datetime.datetime.strptime(input("データ取得最終日を入力してください。(例:20230120)"),"%Y%m%d").date() 5day_diff = day_end -day_start 6 7# サービスアカウントキーファイルを使用した認証 8def initialize_analytics_reporting(): 9 credentials = service_account.Credentials.from_service_account_file(KEY_FILE_LOCATION) 10 scoped_credentials = credentials.with_scopes(SCOPES) 11 return build("analyticsreporting", "v4", credentials=scoped_credentials) 12 13 14def get_report(analytics, next_page_token="0"): 15# 設定に関してはhttps://ga-dev-tools.web.app/dimensions-metrics-explorer/を参照20 16 day_start_date = date_period() 17 request_body = { 18 "reportRequests": [{ 19 "viewId": VIEW_ID, 20 "pageSize": 10000, 21 "pageToken": next_page_token, 22 "dateRanges": [{'startDate': f'{day_start_date}', 'endDate': f'{day_start_date}'}], 23 "metrics": [{"expression": "ga:pageviews"},{'expression':"ga:sessions"}], 24 # "dimensions": [{"name": "ga:pagePath"}, {"name": "ga:pageTitle"}], 25 "orderBys": [{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}] 26 }] 27 } 28 return analytics.reports().batchGet(body=request_body).execute() 29 30 31def get_response(response): 32 rows = [] 33 for report in response.get("reports", []): 34 # pprint(report) 35 column_header = report.get("columnHeader", {}) 36 dimension_headers = column_header.get("dimensions", []) 37 metric_headers = column_header.get("metricHeader", {}).get("metricHeaderEntries", []) 38 next_page_token = report.get('nextPageToken') 39 40 for row in report.get("data", {}).get("rows", []): 41 row_data = {} 42 dimensions = row.get("dimensions", []) 43 date_range_values = row.get("metrics", []) 44 for header, dimension in zip(dimension_headers, dimensions): 45 row_data[header] = dimension 46 for i, values in enumerate(date_range_values): 47 for metricHeader, value in zip(metric_headers, values.get("values")): 48 row_data[metricHeader.get("name")] = value 49 rows.append(row_data) 50 # pprint(row) 51 return rows, next_page_token 52 53def date_period(): 54 n = 0 55 if day_diff.days == 0: 56 print(f"{day_start}だけのデータを取得します。") 57 main() 58 elif (day_diff.days > 0) and (day_end == today): 59 n = 0 60 print(f"{day_start}から今日までを取得します。") 61 for i in range((today-day_start).days,(today - day_start+day_diff).days +1): 62 day_count = day_start + datetime.timedelta(days = n) 63 day_start_date = day_start+ datetime.timedelta(days = n) 64 print(f"{day_count}のデータを取得") 65 n +=1 66 main() 67 time.sleep(2) 68 return day_start_date 69 70 71 else: 72 n = 0 73 print(f"{day_start}から{day_end}までのデータを取得") 74 for i in range((today-day_start).days,(today - day_start+day_diff).days +1): 75 day_count = day_start + datetime.timedelta(days = n) 76 day_start_date = day_start+ datetime.timedelta(days = n) 77 print(f"{day_count}のデータを取得") 78 n +=1 79 main() 80 time.sleep(2) 81 return day_start_date 82 83def main(): 84 analytics = initialize_analytics_reporting() 85 print_response(analytics) 86 time.sleep(2) 87 return print_response(analytics) 88 89 90if __name__ == "__main__": 91 date_period() 92 # a =date_period() 93 # print(a) 94 print(__name__) 95 96

get_report関数内が実行された時、16行目のday_start_dateはdate_period関数内のreturnで返されたday_start_dateが入ってくる想定でした。
しかし、実行してみると無限ループに陥ってしまいます。
どのようにすればget_report関数内のday_start_dateをdate_period関数内で呼び出すことができるでしょうか。
読みにくいコードになっているかもしれませんが確認よろしくお願い致します。

試したこと

rerturnの場所を変えてみるなど試しました。
また、global n とし宣言してあげるようなものを追記してみたり。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

can110

2023/01/25 01:43

コード全体の流れと実現したいことの 「get_report関数内のday_start_dateをdate_period関数内で呼び出す」という部分が理解できませんでした。 提示コードの各関数の引数(何を渡して)、動作(何をして)、戻り値(結果として呼び出し元に何を返すか)についての説明を記載すると回答得られやすくなるかと思います。
kentaronagata

2023/02/01 14:04

今後、質問に関してはcan110さんのアドバイスを参考に質問してみようと思います。 ありがとうございます。 今回の質問の件は関数・引数・returnに関して理解できていなかったのですが、そこを勉強しやりたいことができました。

回答1

1

ベストアンサー

ループ内に return 文があります。この場合、最初のループで値が返されるため、意図しない値が返されてしまいます。data_period() 関数の問題を簡素にした例を挙げます。

python

1def count() -> int | None: 2 for i in range(1, 5): 3 number: int = 0 4 number += i 5 return number 6 7result: int | None = count() 8print(result) # result = 1

return 文は、ループの外側に置く必要があります。加えて返したい値もループの外側で一度初期化しておく必要があります。

python

1def count() -> int: 2 number: int = 0 3 for i in range(1, 5): 4 number += i 5 return number 6 7result: int = count() 8print(result) # result = 10

これ以外にも return 文の使い方が気になる点があるのですが、コードの全体像や処理の流れ等がわからない(特にmain関数)ので、これ以上はどこが悪いのか指摘しようがありません。何故無限ループに陥るのかも提示されているコードの情報だけでは、判別できません。date_period() 関数の条件文全てで、main() 関数が実行されていることが気になりますが、コードの全体像が分からない限り、これが正常な処理かどうかの判断もつきません。

投稿2023/01/25 07:32

Demerara

総合スコア274

kentaronagata👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。