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

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

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

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

Q&A

解決済

3回答

4654閲覧

Pythonで定数をどう処理するべきか

renge

総合スコア18

Python

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

0グッド

0クリップ

投稿2022/09/08 07:54

編集2022/09/08 07:56

概要

Pythonを学習中の初心者です。
複数のファイルで共通して参照したい定数がある場合に適切な方法は何でしょうか。
以下にぱっと思いつくものを3パターン(インスタンスする/しないで6パターン)ほど示しましたが、おそらくこの他に良い方法があると思いますので、皆さんの意見を頂ければと思います

一例

python

1# 方法1 普通にクラス変数に入れる 2class Data: 3 CONST = 1 4 5do_something(Data.CONST) 6# 方法1.1 特に意味はなさそう 7# d = Data 8# do_something(d.CONST) 9 10------------------------------------------------------------------------ 11 12# 方法2 dataclassを使ってインスタンス変数として実装、データを入れてます感がある 13from dataclasses import dataclass 14 15@dataclass # frozenをTrueにしてもいいが恐らく定数感が増すだけで無意味? 16class Data: 17 CONST = 1 18 19d = Data 20do_something(d.CONST) 21#方法2.1 こちらも特に意味はなさそう 22# do_something(Data.CONST) 23 24------------------------------------------------------------------------ 25 26# 方法3 Enumを使ってみる、これもデータを入れてます感がある。 27# アクセスするときにEnumであることを忘れないようにする必要がある。 28from enum import Enum 29 30class Data(Enum): 31 CONST = 1 32 33do_something(Data.CONST.value) 34# 方法3.1 こちらも特に意味はないと思うけど一応 35# d = Data 36# do_something(d.CONST.value)

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問にある案と、「複数のファイルで共通して参照したい定数」をどう扱うかという質問はかみあっていないように思います。

「複数のファイルで共通して参照したい定数」があるのであれば、それを定義するファイルを用意して、それを利用するファイル側でimportするのがいいと思います。

const.py

python

1pi = 3.14 2e = 2.71 3ab = 6.02E23

app.py

python

1import const 2 3circle10 = 10 * 10 * const.pi

表現については、int32_tさんと同意見で、単に定数を定義したいだけならclass化する利点が無いと思います。 自分なら、単に数値を並べますね。

ちなみに、Enumを使うのは違和感があります。 green, red, blueなど、列挙できるものをわかりやすく扱うためのクラスですから、定数を表現するのに向いていないというか、できないのでは?

投稿2022/09/08 09:36

TakaiY

総合スコア14251

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

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

lehshell

2022/09/09 11:15

定数の話をしているのに。。。 pi = 3.14 では const.pi = 1 と書き変えできてしまいますよ。 from enum import Enum class Data(Enum):     PI = 3.14 であれば const.Data.PI = 1 const.Data.PI.value = 1 のように書き変えできませんから Enum を使う意味は充分ありますね。
renge

2022/09/10 01:08

lehshellさん Enumを使えば書き換えができないのはかなり魅力的ですね。 TakaiYさんのEnumを使うことへの違和感は僕もわかるのですが、lehshellさんならどう対処しますか?
TakaiY

2022/09/10 09:06

質問者の案を見ると、いわゆる「定数」(値を変更できない)をそのとおりの意味で使っているようには見えませんね。そもそも言語使用として定数はありませんし、慣例となっている「大文字だけで記述された変数は定数として扱う」で十分でしょう。 ENUMを定数を表現するのに使うのは違和感ありまくりなので賛成できません。 機能として変更できない変数が欲しければ、以下のサイトにあるクラスを使うのがいいんじゃないですかね。 https://code.activestate.com/recipes/414140-constant-types-in-python/
renge

2022/09/13 00:36

返答遅れました 了解です、そのようにしようと思います。 ご回答ありがとうございました。
guest

0

クラスに属する値ならばクラス変数、値クラスなら Enum。
モジュール変数(グローバル変数)にする手もありますよ。

consts.py

1CONST = 1

python:参照する側

1import consts 2 3do_something(consts.CONST)

投稿2022/09/08 09:17

shiracamus

総合スコア5406

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

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

0

定数のアクセスのためだけにインスタンス化を行うのは論外です。実行コストの無駄です。
また、定数のためだけclass を定義するのも見たことがありません。

・定数が、ある既存のクラスに強く関連しているものなら、そのクラスに入れる
・定数が、ある既存のソースファイルに強く関連しているものなら、そのソースファイルのトップレベルで定義する
・そうでないなら、定数専用のソースファイルを作って、そのトップレベルで定義する

という感じでしょうか。

投稿2022/09/08 09:11

int32_t

総合スコア21927

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問