定数の長いリストをPythonファイルにインポートする


90

Pythonには、次のCようなプリプロセッサステートメントの類似物がありますか?:

#define MY_CONSTANT 50

また、いくつかのクラスにインポートしたい定数のリストがたくさんあります。.pyファイル内で上記のようなステートメントの長いシーケンスとして定数を宣言し、それを別の.pyファイルにインポートするのに類似したものはありますか?

編集します。

ファイルにはConstants.py次のように書かれています。

#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

そしてmyExample.py読む:

#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""

import sys
import os

import Constants

class myExample:
    def __init__(self):
        self.someValueOne = Constants.MY_CONSTANT_ONE + 1
        self.someValueTwo = Constants.MY_CONSTANT_TWO + 1

if __name__ == '__main__':
    x = MyClass()

編集します。

コンパイラから、

NameError: "グローバル名 'MY_CONSTANT_ONE'が定義されていません"

関数のinit myExampleでは、13行目でself.someValueOne = Constants.MY_CONSTANT_ONE + 1コピー出力プログラムは、0.06秒後にコード#1で終了しました。


2
いいえ、プリプロセッサはありません。いいえ、PythonでCをコーディングしようとしたり、類似点を見つけようとしたりすることはあまりありません。

それは完全なトレースバックではありません。どのように実行していますか?python myExample.pyファイル名を含むエラーのトレースバック<module>をトップレベルとして提供する必要があります。さらに、グローバル名としての参照でMY_CONSTANT_ONE はありません-本当に奇妙です。それらが実際に実行しているファイルであることをトリプルチェックします(そしておそらくそれらをASCIIに変換して# encoding: utf8ビットを取り除きます)。

@All:ありがとう、今は元気そうです-理由はまだわかりませんが、気にしないでください:)。
SK9 2011年

回答:


131

Pythonは前処理されていません。あなたはただファイルを作成することができますmyconstants.py

MY_CONSTANT = 50

そしてそれらをインポートすることはうまくいくでしょう:

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9:実行している正確なコードを表示します(モジュールの定義と使用の両方)。

@トーマス:上記を参照してください。私は基本を学んでいるので、どこかで何か気の毒なことを間違いなく見逃しました。
SK9 2011年

@ SK9:投稿したコードにはそのようなエラーはありません。何度かチェックして自分で実行しましたが、問題なく動作します。それはできませんでも(名への参照がありません。このエラーにつながりますMAX_FIVE_FLUSH_KEY_INT)。トレースバックを投稿します。

@Thomas:これをテストしてくれてありがとう。うーん、もう一度やり直します。(言及されている参照はタイプミスです。)ファイルを文字通りそのまま試しましたか?(上記の全内容をコピーして貼り付けました。)
SK9 2011年

@ SK9:私はトーマスではありません;)はい、すべてをコピーして貼り付けました。ファイル名もそのままにしました。繰り返しますが、トレースバックはデバッグに役立ちます。

18

Pythonにはプリプロセッサがなく、変更できないという意味で定数もありません。いつでも変更できます(ほぼ、定数オブジェクトのプロパティをエミュレートできますが、定数性のためにこれを行うことはめったにありません)完了し、有用とは見なされません)すべて。定数を定義するときは、アンダースコア付きの大文字の名前を定義し、それを1日と呼びます。「ここではすべて同意している大人です」。正気の人が定数を変更することはありません。もちろん、彼に非常に正当な理由があり、彼が何をしているのかを正確に知っている場合を除いて、その場合、どちらの方法でも彼を止めることはできません(そしておそらく止めるべきではありません)。

ただし、もちろん、値を使用してモジュールレベルの名前を定義し、それを別のモジュールで使用することもできます。これは定数などに固有のものではありません。モジュールシステムで確認してください。

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

11

そしてもちろんあなたができること:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


3
import *は一般的に推奨されていませんが、コードベース全体で広く使用されているCスタイルのマニフェスト定数は、それを使用するのが狂気ではない場所の1つです。ALL_CAPSで、または他のシンボルとの衝突の可能性を減らすプレフィックス規則を使用してそれらに名前を付けると、イディオムに対する主な異議がなくなり、衝突が発生した場合は、いつでも従来のインポート+明示的な名前スタイルにフォールバックできます(import a; a C.とは異なり.MY_CONSTNAT)、
ラッセルBorogove

また、a.MY_CONSTNATは少し遅くなります。これは、インタプリタが1つの名前空間で名前「a」を検索してから2番目の名前空間「MY_CONSTNAT」を検索するためです
tony

7

もちろん、定数を別のモジュールに入れることができます。例えば:

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

print const.A, const.B, const.C

、上記の宣言のようにすることを注意ABおよびC変数であり、すなわち、実行時に変更することができます。


5

「設定」モジュールを使用して定数を作成するを見てみませんか?そして、することができます私の防止はPythonでオブジェクトを変更しますか?

もう1つの便利なリンク:http//code.activestate.com/recipes/65207-constants-in-python/は、次のオプションについて説明しています。

from copy import deepcopy

class const(object):

    def __setattr__(self, name, value):
        if self.__dict__.has_key(name):
            print 'NO WAY this is a const' # put here anything you want(throw exc and etc)
            return deepcopy(self.__dict__[name])
        self.__dict__[name] = value

    def __getattr__(self, name, value):
        if self.__dict__.has_key(name):
            return deepcopy(self.__dict__[name])

    def __delattr__(self, item):
        if self.__dict__.has_key(item):
            print 'NOOOOO' # throw exception if needed

CONST = const()
CONST.Constant1 = 111
CONST.Constant1 = 12
print a.Constant1 # 111
CONST.Constant2 = 'tst'
CONST.Constant2 = 'tst1'
print a.Constant2 # 'tst'

したがって、このようなクラスを作成して、contants.pyモジュールからインポートすることができます。これにより、値が変更、削除されないようにすることができます。


これをありがとう。SOについて尋ねる前に、私はこれらの両方を検索して見つけました。:)
SK9 2011年

@ SK9ああ、重複してすみません
Artsiom Rudzenka 2011年

4

いくつかの回答で説明されているインポートアプローチを使用する代わりに、configparserモジュールを見てください。

ConfigParserクラスは、Microsoft WindowsINIファイルで見られるものと同様の構造を提供する基本的な構成ファイルパーサー言語を実装します。これを使用して、エンドユーザーが簡単にカスタマイズできるPythonプログラムを作成できます。


2

定数のように見える変数だけでなく、本当に定数が必要な場合、それを行う標準的な方法は、不変の辞書を使用することです。残念ながら、まだ組み込まれていないため、サードパーティのレシピ(これあれなど)を使用する必要があります。


2

my_constants.pyのような任意の名前の定数ファイルを作成しますそのような定数を宣言します

CONSTANT_NAME = "SOME VALUE"

そのようなコードインポートファイルの定数にアクセスするため

import my_constants as constant

そして定数値に-としてアクセスします

constant.CONSTANT_NAME
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.