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

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

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

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

Q&A

解決済

1回答

577閲覧

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

kentaronagata

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿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 とし宣言してあげるようなものを追記してみたり。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2023/01/25 01:43

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

2023/02/01 14:04

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

回答1

0

ベストアンサー

ループ内に 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

総合スコア397

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問