ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

火曜日, 7月 22, 2025

Python: Poetry の使い方

 Python のパッケージ管理で便利なツールがあります。pip や venv などもいいですが、ここでは poetry の使い方を説明したいと思います。


インストール


PoetryはPython 3.7以上で動作します。
curl -sSL https://install.python-poetry.org | python3 -


使い方


まず新規プロジェクトを作成します。
 
poetry new <proj>

このコマンドで以下のファイルが作成されます。

proj/
├── pyproject.toml
├── README.md
├── proj/
│   └── __init__.py
└── tests/
    └── __init__.py


Python モジュールの追加


add コマンドを使ってモジュールを追加します。

poetry add requests


追加されたモジュールは pyproject.toml を見ると確認できます。


仮想環境の管理


run コマンドを使って作成した仮想環境下でプログラムを実行します。

poetry run py script.py


仮想環境の構築


GitHub からプロジェクトをダウンロードしたら、install コマンドを使ってモジュールをインストールします。

poetry install

poetry は仮想環境を管理するための分かりやすい・使いやすい優れたツールです。

水曜日, 2月 17, 2021

Flask/wtform/SelectField フォームで入力チェックがうまくいかないとき

 Flask の wtform は入力値の自動チェックを行うので便利なんですが、自動チェックさせるとときどき引っかかるので面倒です。

SelectField を使うなら値はしっかり設定しておかねば入力値はすべてはじいてくれます。選択肢をデータベースからひいてきて自動設定している場合なぞ要注意です。

SelectField を設定する関数を書けば便利です。

Form をインスタンス化しただけで form.validate() をついかけてしまうような間違いを防ぐことができます。

月曜日, 2月 15, 2021

Flask/url_for() で引数を省略

Flask ではルートを指定して動作を指定します。動作は関数で記述します。Flask は指定された関数を起動します。

引数を指定することもできます。引数は<引数>の形で指定、関数の引数で受け継ぎます。この引数を省略できるのか、っていう問題です。

Python の関数はデフォルト値を持つ引数は省略できます。そのノリでそのまま引数のデフォルト値を指定してもルートは判別しません。

ここは引数なしのルートを指定してやります。関数のほうはデフォルト値を指定することで対処します。ここでルートの最後の/(スラッシュ)を指定します。

これで url_for() で引数を省略できます。


水曜日, 8月 21, 2019

Jinja (Flask/SQLAlchemy) で日付をフォーマットする

Flask/SQLAlchemy 使ってる方、jinja で困ってませんか?

本体で Python の関数を書いてもいいんですが、テンプレートでも関数が呼べます。

日付を出したい場合、フォーマットなら strftime() が使えます。


わざわざ文字列を作って渡す必要はありません。



月曜日, 7月 22, 2019

PyMongo で内部結合

PyMongo を使った内部結合の実装です。classics テーブル、baroque テーブルの内部結合を キー composer_id で照らし合わせたものです。

外部結合なら $match の部分なしで結果がとれます。

_id で照らし合わせる場合、ObjectId(id) で合わせるか文字列へ変換するか気を付ける必要があります。

土曜日, 6月 29, 2019

Python: 指数分布のグラフを書く

Python の使いやすさはただごとじゃありません。

ユーザーの層が厚いのはユーザーが多いから。人気が人気を呼ぶパターンですね。ドキュメント類の豊富さ(本家じゃなくても)が質を変えているわけです。民主主義ですよこれは。

使いにくさなんてユーザーが変えていくもんです。多くの人たちが使っていればですね。意見を取り入れる柔軟さはピカイチです。もとからかなり特色ある言語ですが、ライブラリの豊富さでも群を抜いてます。

グラフを書くのもお手の物です。使い慣れた言語で思いのままってのは数式が近く感じられていいもんです。そのままシェルからグラフが書けます。

以下のスクリプトは指数分布を描きます。




金曜日, 9月 21, 2018

型破りな Python

Python でもっとも特徴的なのは抽象化が徹底していること。抽象化ってのはつまりパラメタ化できるってことですね。属性で値(本質)を得ることができるわけです。

変数やメンバ変数などそのものを配列で扱えます。しかも値を文字列で取得できます。これは便利ですね。グローバル、ローカル変数そのものが配列でアクセスできます。

globals()
locals()

型でさえ抽象されてます。同じ変数名で型を変えることが Python なら可能です。なんか抵抗があるようなところが型破りな Python なわけです。

a = 0  # int
a *= 1.0   # float
a = str(a)  # string

ここで型は変数の属性、変えることのできる属性の一種です。

これができるってことはつまり静的型チェックがないわけなんですが、そもそも Python はコンパイラなんてもたないんですよね。

有名どころでは、True/False がそのまま数です。


if False + 1:
    print('???')

水曜日, 9月 19, 2018

Python: try ブロックでコードが終わるとき

ゆえあってPythonでシステムを書いている今日この頃なんですが、面白い発見をしたのでここで書いておきます。

まあ、もとはといえばtry-except-finallyなど書いていて、データベース接続をどこで閉じるかっていう議論があったわけです。finallyブロックでどうか、なんていうことで議論は収束しました。

しかしながらここで「え」「これfinallyこないんじゃない」「無理だよ」「unreachable」っていう指摘が出てきたわけなんです。tryブロックで値を返していたわけなんですね。finallyへは来ないんじゃ…

しばらくして「あれ?」って声が上がりました。これです。

この結果は…(走らせてみてください)。

tryブロックで終了するコードだと起きる現象ですね。

実はこれ、Javaでも同様です(走らせてみてください)。

土曜日, 8月 11, 2018

Python でタイミング図(信号)を描く

Python ライブラリの matplotlib を使ってタイミング図を描く方法です。


それはいいんですが、ここで一言。



Python プロジェクトでライブラリのバージョンを管理するなら仮想環境が要ります。
 
numpy モジュールを読見込む際、signal.py でみごとこけました。です。

ので「休日を返せ」モードで 

(Python は素晴らしい言語かもしれないが)ライブラリ管理がなっていない。 

なってないです。つまり、Java でいう Central Repository + Maven がない。

「numpy を使うなら singal.py ファイルを作ってはならない」なる注意書きが必要です。信じがたい。



で、タイミング図を書く方法です。

ここのポイントは線グラフの描写で、毎クロックで縦線をひきます。

折れ線グラフは点を指定して図を描いているのと同じなので、x値を繰り返せばそこで縦線がひかれるわけですね。

xValue で指定しているのがそれです。

金曜日, 5月 04, 2018

Python: ファイルリストをソートする

このところゆえあって Python プロジェクトを担当しております。

括弧のない簡便さ、行末のセミコロンなし、インデント必須ってのははまりますね。

ライブラリの豊富さってのはプログラミング言語のすべてみたいなもんですが、こいつばかりは人気がモノを言います。

もっとも好まれる言語で選ばれる Python ならではの強みですね。

その Python でディレクトリ中のファイルをリストアップするスクリプトを書いてみました。

path でディレクトリを、type でソートのキーを指定します。

火曜日, 8月 29, 2017

Python 3.6 でユニコードを扱う場合。

Python 3.6 でデータベースからユニコード文字列をとってきて書きだそうと思うと引っかかります。

要はこれです。

f=open('test.txt', 'w', encoding="utf-8")

ユニコードを指定します。でないとエラーを出します。

月曜日, 8月 28, 2017

Python/MySQL のクエリーで%を使う

単純な話ですが ...

Python 3.6 はライブラリが一通りそろっていて文字列処理が楽です。

データベースを使うなら mysql-connector-python のようなドライバを導入してアクセスします。

クエリの書き方ですが、カーソルの execute() メソッドを使います。

クエリをそのままかくのもいいんですが、パラメタ化してエスケープするやり方です。

cur.execute("select * from genera where latin like %s", (genus,))

このカッコ、コンマは省略できません。

ここまでは既出だと思うんですが、ここで % を使いたい場合。

つまんない話なんですが、ネットでなかったんですよね。直接の記述が。これパラメタそのものをいじればいいんです。

genus = genus +"%"

これで%が使えます (いや、それだけです)。

Flask の Blueprint のテンプレート問題

  Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...