Python + pytestにて、「pytest.raisesを使って例外をアサーションする」テストコードを作成する機会がありました。 ただ、書き方を誤りうまくアサーションできなかっため、メモを残します。 目次 環境 状況 原因 対応 ソースコード 環境 Python 3.6.0 unittest.mock.patchを使用 pytest 3.0.7 状況 テスト対象のメソッドtarget_method()は、以下とします。 pytest_raises.py from with_statement_library import Validator class Target(object): def target_method(self): """テスト対象のメソッド""" validator = Validator() validator.run() テスト対象クラスでimportしてい
インターネットでよく解説されているシンプルなコードは上のようなものだと思いますが、このコードをプロダクションで使用すると、対象のサーバーが応答しない場合フリーズしてしまう可能性があります。timeoutが設定されていない、つまり、最大で何秒待機すればよいか指定されていないからです。Webサービスの場合、待機中はユーザーに応答できなくなるので、本当は別の依存しているサーバーに責任があるのに、ユーザーにはあなたのWebサービスに問題があるように見えてしまうかもしれません。 Timeout を設定する必要性 ですから、timeout を設定しましょう。数秒待って応答が来なかったらエラーとして処理すればよいのです。 requests公式のドキュメントでもtimeoutを設定することが推奨されています。 Most requests to external servers should have a
こんにちは、@yoheiMuneです。 久しぶりのブログ、書きたいことがいっぱいです。プログラムでエラーが発生した時に重宝されるスタックトレース。Python言語におけるエラーハンドリングの方法と、そこでのスタックトレースの取得方法を、今日はブログに書きたいと思います。 目次 スタックトレースとは スタックトレースは、プログラムで例外が発生した際に、どのように関数が呼び出されたのか、どこでエラーが発生したのか、を特定できる情報です。不具合発生時の原因究明に、重宝されます。例えば以下のプログラムがあるとします。 def a(): """b関数を呼び出す""" b() def b(): """c関数を呼び出す""" c() def c(): """例外が発生する""" char = None char.format('hello') # ここで例外発生 # a関数から呼び出してみる a() こ
※2019/8/12 書籍のリンクを最新版に更新 PyCon JP 2017で発表した野球×Pythonの分析ネタの詳細解説です.*1 プレゼンテーション:野球を科学する技術〜Pythonを用いた統計ライブラリ作成と分析基盤構築 | PyCon JP 2017 in TOKYO speakerdeck.com youtu.be 時間および諸々の都合(察し)で公開できなかった*2, 「人とWebに優しい」Scrapyアプリのサンプル(なお野球) を作って公開したのでその紹介と,PyConのプレゼンで発表しきれなかった部分を簡単に紹介します. おしながき おしながき 対象の読者 参考文献 Scrapyを用いた日本プロ野球データ取得Exampleアプリ ポイント 全体像 「人とWebに優しい」settings.pyの書き方 Spider(クローラー本体)について〜Itemも添えて Spider.
AWS Rekognition を使う時にクローラーも使ってなんかできないかなと思い scrapy を利用してみました。とりあえず今回はドメインと画像収集のところまで。いかがわしいことには絶対利用しないでください 今回はスタートのページからどんどんリンクを辿り、ドメイン名のフォルダごとに、辿った時のページの画像を保存します。今度そのフォルダごとに画像を AWS Rekognition に投げて、そのドメインがどんなドメインなのかを画像から判別しようと考えています。 前提 scrapy 1.5.0 python3 scrapy インストール済み 参考サイト scrapy を用いてデータを収集し、mongoDB に投入する - Qiita ScrapyでWebサイトのタイトルとURLを再帰的に取得する - Qiita Spider のコード クローラーの肝となる部分です。参考サイトではCraw
突然ですが Scrapy v1.1.0 から Python 3 に対応して嬉しいですね。これまで Scrapy のために 2.7 で通してきたんで。 さて、今回は Scrapy における エラーハンドリング(例外処理) についてまとめようと思います。 スクレイピングという行為は外部の構造化されていないデータを取ってくるものなので例外はつきものです。 例外が投げられたとき 何となく正常終了したように見せる ことは厳禁です。例外から正しく復帰させるか、または例外が投げられたならば正しく落とすことが重要です。 でないと、その後に例外に気づいて調節→リトライできませんからね。 Scrapy データフローに沿ったエラーハンドリング スクレイピング中に起こる不測の例外をキャッチするために通常の try ... except 文を使う事はできません。 なぜなら、我々が記述した Spider を実際に起動
なんか気がつけば2017年8月から始めたBlogも1万アクセスを突破してました。めでたい。 さて、最近はDjangoよりもScrapyに触ってる事が多いです。結構日本語の情報も増えてきましたが、Django等に比べるとまだまだ利用者が少ないのか情報が少ない部分もあります。 このBlogではScrapyにはじめて触れますが、いきなりテストについてメモ代わりにまとめておきます。ScrapyではSpiderというコンポーネントをクロール対象ごとに作成します。このSpiderのテストをどうするかについてです。 サンプルの構成 今回のプロジェクトは以下のような構成です。といってもscrapy startprojectしてdenzowblogというspiderを一つ追加しただけの状態です。 . ├── scrapy.cfg └── testscrapy ├── __init__.py ├── item
better-exceptions インストール 使い方 better-exceptions github.com better-exceptionsを使用すると例外情報が図のようにみやすくなる。 インストール pipでインストールできるので下記コマンドを実行。 $ pip install better_exceptions 使い方 以下のようにbetter_exceptionsをインポートすればよい。 import better_exceptions 試しに下記コードを実行した場合の出力を比べてみる。 import better_exceptions foo = 52 def shallow(a, b): deep(a + b) def deep(val): global foo assert val > 10 and foo == 60 bar = foo - 50 shallow(b
経緯 私,自然言語処理に携わる研究を行っているのですが 必然と大規模なテキストデータを扱います. (恐らく大半の言語処理のプログラムを書いている方に訪れるであろう)鬼門が どれだけ網羅しようともテキストデータに例外が存在する ということです. 自然言語処理の大半は,この例外と戦うのではないのかというぐらいに 例外が発生しまくります. これを取り除くために前処理(の前処理)という形で テキストのフィルタリング・整形を行う必要が出てくるわけです. それでも潰しても,潰しても消えない例外は存在するわけでして… ならば例外が起こることを考慮したプログラムを書くのが一番です. ということで今回の記事を書くに当たりました. コンテンツ 例外処理の書き方 例外を定義する デコレータを使った賢い例外処理 1.例外処理の基本 pythonにおける基本的な例外処理は以下のように書きます. try: # 例外が
普段 Python:Ruby = 7:3 くらいの比率で書いていると,些細だけど大きな両者の違いに気がつく(と同時に,あーやっぱ Ruby っていいなって思う)ことが結構あって, 例えば(連想)配列アクセスで,範囲外のインデクスやらキーを指定した場合, Python -> 例外(IndexError/KeyError)を投げる Ruby -> nil を返す という決定的な違いがある. いちいち例外を投げられると,それを適切にハンドリングしてあげないといけないのはちょっと面倒だったりする. 本当に卑近な例だけど,設定ファイルを yaml で読み込んで,連想配列に変換して,その要素にアクセスするなんて場面を考えてみる.たとえば,
pythonで普通に例外処理を書くと、以下のようになる。 def hoge(*args): try: # 処理 except Exception as e: # 例外処理 return def fuga(*args): try: # 処理 except Exception as e: # 例外処理 return def piyo(*args): try: # 処理 except Exception as e: # 例外処理 return 例外処理の内容が全て同じである場合(例えばログに吐き出すとか)、かなり冗長である。 そこでデコレータを使用すると以下のように書ける。 def exception(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: # 例外
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く