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

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

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

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

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

711閲覧

Python osモジュールの変数名の謎の表記について

sasaodayo

総合スコア1

Flask

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

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/27 14:27

前提

Python とflaskで画像管理アプリを作ろうと思い下記の記事を参考に作りました。

https://bokepro.blog.fc2.com/blog-entry-8.html

osモジュールを使いファイルの拡張子を取得するのですが、変数名に見慣れない表記がありました。

該当のコード六行目でextという変数を定義してますが変数名の前にアンダースコアとコンマが記述されてます。
この書き方が何を意味しているのか分からずモヤモヤしています。

実現したいこと

このアンダースコアとコンマが何なのか知りたいです。このような書き方は初めてみました。

試しにこの_,を除いて実行してみたところAttributeErrorエラーになってしまいました。なのでアンダースコアの記述は合っているということになります。

もしこれについて何かご存知の方がいらっしゃいましたらご教授の程、よろしくお願いします。

発生している問題・エラーメッセージ

AttributeError: 'tuple' object has no attribute 'lower'

該当のソースコード

python

1@app.route("/", methods=['GET', 'POST']) 2def index(): 3 if request.method == 'POST': 4 img_file = request.files['img_file'] 5 # ファイルの拡張子を取得する 6 _, ext = os.path.splitext(img_file.filename) 7 # 小文字にして 8 ext = ext.lower() 9 if ext and ext in ALLOWED_EXTENSIONS: 10 # ランダムなファイル名を決める 11 new_name = secrets.token_urlsafe(16) + ext.lower() 12 # 縮小して保存 13 i = Image.open(img_file) 14 i.thumbnail((200, 200)) 15 i.save(os.path.join(UPLOAD_FOLDER, new_name)) 16 # データベースに保存 17 obj = FileUp(name=new_name) 18 db.session.add(obj) 19 db.session.commit() 20 21 return redirect(url_for('index')) 22 23 else: 24 # http://flask-sqlalchemy.pocoo.org/2.3/queries/ 25 images = FileUp.query.order_by(FileUp.id.desc()).all() 26 return render_template('index.html', images=images)

試したこと

osモジュールに関することや、このアンダーバーについて色々調べましたが情報が一切出て来ませんでした。元の記事でも特に言及されていなかったので余計にモヤモヤしてしまいます。

補足情報(FW/ツールのバージョンなど)

Flask 2.2.2
Flask-SQLAlchemy 3.0.2
Flask-WTF 1.1.1

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

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

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

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

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

sasaodayo

2023/01/27 15:13

ご指摘ありがとうございます。 この件に関して調べてみたのですが、中々答えが見つからずこちらの方で質問させていただきました。 次回からは自分で答えが見つけられるようにスキルを磨いていきたいと思います。
guest

回答2

0

ベストアンサー

同関数のリファレンスに細かいことが書いてありますので、要約だけ書きます。

タプルの謎

AttributeError: 'tuple' object has no attribute 'lower'

y = f(x)のようなよく見る一次関数のような関数があった時には、変数xを関数fで捌いた答えy1つです。

一方、「ファイル名」を突っ込むと「ファイル名と拡張子」に分割する関数fの場合、答えが2つ出てきます。
これをPythonっぽく書くと、a, b = func(x)となり、ファイル名aと拡張子bのように答え2つを表すことができます。※実際にはdef func():の末尾にreturn (a,b)とあるはずです。
なので、

AttributeError: 'tuple' object has no attribute 'lower'

は、tuple.lower()のような処理をしようとして出た、と考えることができます。本当はstr.lower()のようでないと動かないためエラーが起きた、というわけです。

_, の謎

このアンダースコアとコンマが何なのか知りたいです。

これは、先のa, b = func(x)aには用がないとき、「うーん、どうせこの変数は使わないけどフォーマット的に何か箱を置いて受けないとエラーが起きるしなぁ」と思うわけですが、「あー、なら何でもいい意味のない変数の代表として_を使えばいいよね。」というPythonのお決まりの記号として_が使われています。

…なので、私はやったことは無いですが、print(_)とするときちんと中身が返ってくるはずです。

投稿2023/01/27 14:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sasaodayo

2023/01/27 15:05

ありがとうございます! 慣習的にいらない変数はアンダーバーに入れるんですね。知らなかったです・・ タプルの説明もわかりやすくてスッキリしました!
guest

0

# ファイルの拡張子を取得する _, ext = os.path.splitext(img_file.filename)

上記コードでextに拡張子を代入していると思われます。おそらく必要なのは拡張子でありファイル名は必要ないので慣習として_を使用しているのでしょう。_でなくても他の変数名でもエラーにはなりません。

参考:Pythonのアンダースコア( _ )を使いこなそう!

試しにこの_,を除いて実行してみたところAttributeErrorエラーになってしまいました。

os.path.splitext(path) は要素数2のタプルを返すので、左辺の変数を1つにしてしまうとエラーとなるでしょうね。

投稿2023/01/27 14:44

meg_

総合スコア10580

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

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

sasaodayo

2023/01/27 15:07

ありがとうございます! なるほど。splitextは二つのタブルを返すから変数も二つ必要なのですね。 アンダーバーはpythonのお決まり文句ということも初めて知りました・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問