web-dev-qa-db-ja.com

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

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 __== '__main__':
    x = MyClass()

編集。

コンパイラーから、

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

function init myExample in line 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 copy outputプログラムは、0.06秒後にコード#1で終了しました。

69
SK9

Pythonは前処理されていません。ファイルを作成するだけで_myconstants.py

MY_CONSTANT = 50

そしてそれらをインポートするだけで動作します:

import myconstants
print myconstants.MY_CONSTANT * 2
97
Thomas K

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

ただし、もちろん、モジュールレベルの名前を値で定義し、別のモジュールで使用できます。これは、定数または特定のものではなく、モジュールシステムで読み取られます。

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT
15
user395760

そしてもちろんできること:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT
8
tony

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

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

上記で宣言したように、AB、およびCは変数であることに注意してください。つまり、実行時に変更できます。

7
NPE

見てみてください 「設定」モジュールを使用して定数を作成しますか? および Pythonでオブジェクトの変更を防止できますか?

別の便利なリンク: 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モジュールからインポートできます。これにより、値が変更、削除されないことを確認できます。

4

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

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

4
Fredrik Pihl

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

1
vartec