質問編集履歴

4

for文のなかにreturn文を挿入しました

2023/02/25 10:51

投稿

takashi0
takashi0

スコア1

test CHANGED
File without changes
test CHANGED
@@ -11,51 +11,6 @@
11
11
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-24/a4d697b7-836b-4bde-a18b-1ba0b9f995d7.png)
12
12
 
13
13
  6が出力されないということはfor文を処理した後に実行されるはずのreturn文を処理せずに関数が終了しているのですが、原因がわかる方はいらっしゃいますか?
14
-
15
-
16
-
17
- ```ここに言語名を入力
18
- Python 3.10.8
19
- ソースコード
20
- ```
21
-
22
- ### 試したこと
23
- 1日中考えても原因がわかりませんでした。
24
- ```ここに言語を入力
25
- python 3.10.8
26
- コード
27
- ```def get_match_odds(driver: webdriver) -> dict:
28
-
29
- def _get_match_odds(participants_elements):
30
- if len(participants_elements) == 2:
31
- return ['playerA(teamA)', 'playerB(teamB)']
32
- else:
33
- return ['playerA(teamA)', 'draw', 'playerB(teamB)']
34
-
35
- odds_d = {}
36
-
37
- # オッズ一覧を取得
38
- odds_elements = driver.find_elements_by_css_selector('div[data-test-id="Collapse"]')
39
-
40
-
41
- # オッズのタイトルを取得する
42
- # 「マネーライン」が含まれているものを取得対象とする
43
- for odds_element in odds_elements:
44
-
45
- if 'Money Line' in odds_element.find_element_by_css_selector('div[class^="style_title__1lSes collapse-title style_collapseTitle__1bRAY"]').text or 'Money Line – Match' in odds_element.find_element_by_css_selector('span[class^="style_title"]').text:
46
-
47
- participant_elements = odds_element\
48
- .find_element_by_css_selector('div[class^="style_buttonRow"]')\
49
- .find_elements_by_tag_name('button')
50
-
51
- for participant_element, player_segment in zip(participant_elements, _get_match_odds(participant_elements)):
52
- name = participant_element.find_element_by_css_selector('span[class^="style_label"]').text
53
- odds = participant_element.find_element_by_css_selector('span[class^="style_price"]').text
54
- odds_d[player_segment] = {'name': name, 'odds': odds}
55
- print(5)
56
- print(6)
57
- return odds_d
58
- ```
59
14
 
60
15
  指摘がございましたので、おっしゃる通り該当部分のコードを入力しましたが、大規模なプロジェクトファイルの一部で、全部載せるとおそらく読んで理解していただくのにお時間がかかってしまうと思いますので、よろしければ修正というよりはreturn文の処理を経由しないで関数の処理が終了していることについてこのようになってしまっている原因を発現できるようにどのようなコードを挿入すればわかるか教えていただければ嬉しいです。
61
16
  今のところプログラム上ではエラーがで処理が中断せずに実行できている状況で下から4行目のodds_d[player_segment] = {'name': name, 'odds': odds}の部分についてもodds_dは正常に出力できています。
@@ -114,7 +69,8 @@
114
69
 
115
70
 
116
71
  print(6)
117
- return odds_d```
72
+ return odds_d
73
+ ```
118
74
 
119
75
  原因がわからないので、とりあえずfor文のなかでreturn文をいれることで意図したとおりにファイルが動作しましたので、これで使用していこうと思います。最後まで原因がわからずじまいでしたが、コメントをくださった方にお礼を申し上げます。
120
76
 

3

for文の中でreturn文を実行しました

2023/02/25 10:46

投稿

takashi0
takashi0

スコア1

test CHANGED
File without changes
test CHANGED
@@ -66,3 +66,55 @@
66
66
  コメントしてくださった方、回答をくださった方、まことにありがとうございます。
67
67
  エラーの内容はValueError: No objects to concatenateで連結対象のものがないということですが、こちらは「return odds_d」を処理できなかったことによるもので最後に連結させるような仕組みのファイルになっています。for文のなかでodds_dは{'playerA(teamA)': {'name': 'BC Alte Kanti Aarau', 'odds': '6.200'}, 'playerB(teamB)': {'name': 'Esperance Sportive Pully', 'odds': '1.104'}}
68
68
  と書かれていることからとれていて、これを再帰ループするような仕組みにしているので、この関数自体は処理が中断されていない状態です。目的のodds_dは取れていて、関数自体もエラーで止まっていないにも関わらずreturnの部分が処理できていない状態で、お手上げ状態です。
69
+
70
+ コメントありがとうございます。おっしゃる通り関数の直下にprint(0)を入れ、この関数の実行直後にprint(7)を入れました。
71
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-25/ce03c73e-b22c-4d18-998c-042283f82a7b.png)
72
+ すると、0557と関数が再帰ループしていることがわかります。
73
+
74
+ ```ここに言語を入力
75
+ コード
76
+ ```def get_match_odds(driver: webdriver) -> dict:
77
+ """
78
+ オッズの取得
79
+ """
80
+ print(0)
81
+ def _get_match_odds(participants_elements):
82
+ if len(participants_elements) == 2:
83
+ return ['playerA(teamA)', 'playerB(teamB)']
84
+ else:
85
+ return ['playerA(teamA)', 'draw', 'playerB(teamB)']
86
+
87
+ odds_d = {}
88
+
89
+ # オッズ一覧を取得
90
+ odds_elements = driver.find_elements_by_css_selector('div[data-test-id="Collapse"]')
91
+
92
+
93
+ # オッズのタイトルを取得する
94
+ # 「マネーライン」が含まれているものを取得対象とする
95
+ for odds_element in odds_elements:
96
+
97
+
98
+ if 'Money Line' in odds_element.find_element_by_css_selector('div[class^="style_title__1lSes collapse-title style_collapseTitle__1bRAY"]').text or 'Money Line – Match' in odds_element.find_element_by_css_selector('span[class^="style_title"]').text:
99
+
100
+ participant_elements = odds_element\
101
+ .find_element_by_css_selector('div[class^="style_buttonRow"]')\
102
+ .find_elements_by_tag_name('button')
103
+
104
+
105
+ for participant_element, player_segment in zip(participant_elements, _get_match_odds(participant_elements)):
106
+ print(5)
107
+ name = participant_element.find_element_by_css_selector('span[class^="style_label"]').text
108
+
109
+ odds = participant_element.find_element_by_css_selector('span[class^="style_price"]').text
110
+
111
+ odds_d[player_segment] = {'name': name, 'odds': odds}
112
+ if player_segment == 'playerB(teamB)':
113
+ return odds_d
114
+
115
+
116
+ print(6)
117
+ return odds_d```
118
+
119
+ 原因がわからないので、とりあえずfor文のなかでreturn文をいれることで意図したとおりにファイルが動作しましたので、これで使用していこうと思います。最後まで原因がわからずじまいでしたが、コメントをくださった方にお礼を申し上げます。
120
+

2

エラーメッセージをのせます

2023/02/25 02:57

投稿

takashi0
takashi0

スコア1

test CHANGED
File without changes
test CHANGED
@@ -61,3 +61,8 @@
61
61
  今のところプログラム上ではエラーがで処理が中断せずに実行できている状況で下から4行目のodds_d[player_segment] = {'name': name, 'odds': odds}の部分についてもodds_dは正常に出力できています。
62
62
  よろしくお願いいたします。
63
63
 
64
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-25/b5f85a5f-50f6-4bac-b741-843ae13fafd2.png)
65
+
66
+ コメントしてくださった方、回答をくださった方、まことにありがとうございます。
67
+ エラーの内容はValueError: No objects to concatenateで連結対象のものがないということですが、こちらは「return odds_d」を処理できなかったことによるもので最後に連結させるような仕組みのファイルになっています。for文のなかでodds_dは{'playerA(teamA)': {'name': 'BC Alte Kanti Aarau', 'odds': '6.200'}, 'playerB(teamB)': {'name': 'Esperance Sportive Pully', 'odds': '1.104'}}
68
+ と書かれていることからとれていて、これを再帰ループするような仕組みにしているので、この関数自体は処理が中断されていない状態です。目的のodds_dは取れていて、関数自体もエラーで止まっていないにも関わらずreturnの部分が処理できていない状態で、お手上げ状態です。

1

関数のコードを画像ではなく、記入欄に挿入しました

2023/02/24 12:35

投稿

takashi0
takashi0

スコア1

test CHANGED
File without changes
test CHANGED
@@ -21,5 +21,43 @@
21
21
 
22
22
  ### 試したこと
23
23
  1日中考えても原因がわかりませんでした。
24
+ ```ここに言語を入力
25
+ python 3.10.8
26
+ コード
27
+ ```def get_match_odds(driver: webdriver) -> dict:
24
28
 
29
+ def _get_match_odds(participants_elements):
30
+ if len(participants_elements) == 2:
31
+ return ['playerA(teamA)', 'playerB(teamB)']
32
+ else:
33
+ return ['playerA(teamA)', 'draw', 'playerB(teamB)']
25
34
 
35
+ odds_d = {}
36
+
37
+ # オッズ一覧を取得
38
+ odds_elements = driver.find_elements_by_css_selector('div[data-test-id="Collapse"]')
39
+
40
+
41
+ # オッズのタイトルを取得する
42
+ # 「マネーライン」が含まれているものを取得対象とする
43
+ for odds_element in odds_elements:
44
+
45
+ if 'Money Line' in odds_element.find_element_by_css_selector('div[class^="style_title__1lSes collapse-title style_collapseTitle__1bRAY"]').text or 'Money Line – Match' in odds_element.find_element_by_css_selector('span[class^="style_title"]').text:
46
+
47
+ participant_elements = odds_element\
48
+ .find_element_by_css_selector('div[class^="style_buttonRow"]')\
49
+ .find_elements_by_tag_name('button')
50
+
51
+ for participant_element, player_segment in zip(participant_elements, _get_match_odds(participant_elements)):
52
+ name = participant_element.find_element_by_css_selector('span[class^="style_label"]').text
53
+ odds = participant_element.find_element_by_css_selector('span[class^="style_price"]').text
54
+ odds_d[player_segment] = {'name': name, 'odds': odds}
55
+ print(5)
56
+ print(6)
57
+ return odds_d
58
+ ```
59
+
60
+ 指摘がございましたので、おっしゃる通り該当部分のコードを入力しましたが、大規模なプロジェクトファイルの一部で、全部載せるとおそらく読んで理解していただくのにお時間がかかってしまうと思いますので、よろしければ修正というよりはreturn文の処理を経由しないで関数の処理が終了していることについてこのようになってしまっている原因を発現できるようにどのようなコードを挿入すればわかるか教えていただければ嬉しいです。
61
+ 今のところプログラム上ではエラーがで処理が中断せずに実行できている状況で下から4行目のodds_d[player_segment] = {'name': name, 'odds': odds}の部分についてもodds_dは正常に出力できています。
62
+ よろしくお願いいたします。
63
+