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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Q&A

解決済

2回答

4367閲覧

デバック実行時には値が取れているが、ValueError: not enough values to unpack (expected 2, got 1)がでる。

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

0グッド

0クリップ

投稿2018/09/06 04:03

編集2018/09/06 04:03

以下のコードで何故か、一つ値を返していないエラーが吐き出されます?なぜでしょうか?どう解決すればよいのでしょうか?

flask

1def preset_header(): 2 d = {'test': ["test1:test2", "Authorization"]} 3 for v in d.values(): 4 import pdb; 5 pdb.set_trace() 6 yield v[0], v[1] 7 8 9@pytest.fixture 10def req(app): 11 12 auth_header, auth_test = preset_header() 13 ... 14 ... 15 ... 16 17 with app.test_request_context(path, method="POST", headers=headers, data=payload) as req: 18 yield req 19

error

> auth_header, auth_test = preset_header() E ValueError: not enough values to unpack (expected 2, got 1) test_decorators.py:252: ValueError

pdb

1-> yield v[0], v[1] 2(Pdb) p v 3["test1:test2", "Authorization"] 4(Pdb) p v[0] 5"test1:test2" 6(Pdb) p v [1] 7'Authorization'

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

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

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

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

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

guest

回答2

0

ベストアンサー

うーん、意図が読めないのですが、yieldを使った関数はgeneratorになります。generatorは関数呼び出しの形で生成して、next関数でyieldまで駆動させます。

Python

1ph_generator = preset_header() 2auth_header, auth_test = next(ph_generator)

ただ、このジェネレータオブジェクトはsession間で共有されないので、どうにも用途が読めないです。


これか。

Python

1 for auth_header, auth_test in preset_header(): 2 with app.test_request_context(path, method="POST", headers=headers, data=payload) as req: 3 yield req

投稿2018/09/06 04:22

編集2018/09/06 05:07
tachikoma

総合スコア3601

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

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

sequelanonymous

2018/09/06 04:38

やりたいことは、dに色んな値を入れてパターン別にテストしたいと思っています。まだ、testというkeyにひもづく値しかテストしてますが、keyとパラメータを増やしていきたいと思っていて、まずは最小限やコードで試しています。
tachikoma

2018/09/06 04:47

クエリが来るたびに値を変更しながらテストしていく感じですかね。
sequelanonymous

2018/09/06 04:59

with句でリクエストを生成してるんですが、値をかえて順番に複数のパターンのリクエストを飛ばして、そのリクエストで返ってくるレスポンスの値を確認したいんですよね。
tachikoma

2018/09/06 05:08

コード追記しましたが、pytestの使い方をちゃんと覚えてないのでこれで動くかよく分かりません。
sequelanonymous

2018/09/06 05:45

ありがとうございます!このコードで動きました。
guest

0

やるならこんな感じですかね。
ジェネレータの要素を順に引っ張りださなければならないので。

Python

1for auth_header, auth_test in preset_header(): 2 ...

投稿2018/09/06 04:09

LouiS0616

総合スコア35658

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

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

sequelanonymous

2018/09/06 04:35

上記のコードでいうと、順番にというのは、auth_header をとってから、auth_testをとるということでしょうか?
LouiS0616

2018/09/06 04:40

いえ、まずイテレータを作ってから、その要素を順に引き出すという意味です。 tachikomaさんの回答のコードをご覧ください。 for文を使うと イテレータの取得・毎周のnext関数の呼び出し を隠蔽できるので、より意図が伝わりやすいコードになります。
sequelanonymous

2018/09/06 04:52

理解しました。ありがとうございます。自分でも後ほど試してみますが、ふと思ったのが、dにさらに新しくkeyとvalueを追加していった際、returnでも順番にテストできるのかなと思ったのですが、どう思いますでしょうか? 今のkeyとvalueのセットが一つしかない状況だとreturn であれば正常に処理が通ります。
LouiS0616

2018/09/06 05:00

returnを使った場合最初の要素を返したところで関数から脱出してしまうので、dの要素が増えていったときに対応できないです。 flaskもpytestもあまり知らないので、ともすればより適した方法があるのかもしれませんが。
sequelanonymous

2018/09/06 05:06

やはり、そうですよね。 pytestには、parametrizer という関数があるのですが、これの使い方が結構議論されていてベストプラクティスがなく、現状のコードでは実装できないようで。いずれにせよ、お返事ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問