Uzun bir sabit listesinin bir Python dosyasına aktarılması


92

Python'da, Cönişlemci ifadesinin bir benzeri var mı ?:

#define MY_CONSTANT 50

Ayrıca, birkaç sınıfa aktarmak istediğim geniş bir sabitler listesi var. Sabitleri bir .pydosyada yukarıdaki gibi uzun bir ifade dizisi olarak ilan edip başka bir dosyaya aktarmanın bir analogu var mı?.py dosyaya ?

Düzenle.

Dosya Constants.pyokur:

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

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

Ve myExample.pyokur:

#!/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()

Düzenle.

Derleyiciden,

NameError: "'MY_CONSTANT_ONE' genel adı tanımlı değil"

13. satırdaki myExample'daki function init self.someValueOne = Sabitler.MY_CONSTANT_ONE + 1 kopya çıktı Program 0.06 saniye sonra # 1 koduyla çıkıldı.


2
Hayır, önişlemci yok. Ve hayır, Python'da C kodlamaya, hatta paralellikleri bulmaya çalışmaktan çok uzaklaşmayacaksınız.

Bu tam izleme değil. Nasıl çalıştırıyorsun? python myExample.pydosya adlarını içeren ve <module>üst düzey olarak bir hata durumunda geri bildirim vermelidir . Artı, küresel bir isim olarak referanslar MY_CONSTANT_ONE değil - gerçekten tuhaf. Bunların gerçekten çalıştırdığınız dosyalar olup olmadığını üç kez kontrol edin (ve belki onları ASCII'ye dönüştürün ve # encoding: utf8biti çıkarın).

@All: Teşekkürler, şimdi iyiyim - henüz neden olduğundan emin değilim, ama boşver :).
SK9

Yanıtlar:


139

Python önceden işlenmemiştir. Sadece bir dosya oluşturabilirsiniz myconstants.py:

MY_CONSTANT = 50

Ve bunları içe aktarmak sadece işe yarar:

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9: Çalıştırdığınız kodu tam olarak gösterin (hem modülü tanımlarken hem de kullanarak).

@Thomas: Yukarıya bakınız. Temelleri öğrenirken bazı yerlerde kesinlikle saçma bir şeyi kaçırdım.
SK9

@ SK9: Gönderdiğiniz kodda böyle bir hata yok. Birkaç kez kontrol ettim ve kendim çalıştırdım, gayet iyi çalışıyor. O olamaz bile (bir isme hiçbir gönderme var bu hataya yol MAX_FIVE_FLUSH_KEY_INT). Geri dönüşü yayınlayın.

@Thomas: Bunu test ettiğiniz için teşekkürler. Hmm, tekrar deneyeceğim. (Bahsedilen referans bir yazım hatasıdır.) Dosyaları olduğu gibi denediniz mi? (Yukarıdaki tüm içeriği kopyalayıp yapıştırdım.)
SK9

@ SK9: Ben Thomas değilim;) Ve evet, her şeyi kopyalayıp yapıştırdım, hatta dosya adlarını olduğu gibi bıraktım. Yine, traceback, hata ayıklamamıza yardımcı olur.

18

Python'un bir ön işlemcisi yoktur, değiştirilemeyecekleri anlamında sabitleri de yoktur - her zaman değiştirebilirsiniz (neredeyse, sabit nesne özelliklerini taklit edebilirsiniz, ancak bunu sabitlik uğruna yapmak nadiren yapılır ve yararlı sayılmaz) her şey. Bir sabiti tanımlarken, alt çizgi ile büyük harf olan bir isim tanımlarız ve buna bir gün deriz - "Hepimiz burada rıza gösteren yetişkinleriz", aklı başında hiçbir insan bir sabiti değiştirmez. Elbette çok iyi nedenleri olmadığı ve ne yaptığını tam olarak bilmediği sürece, bu durumda onu her iki şekilde de durduramazsınız (ve muhtemelen yapmamalısınız).

Ancak elbette bir değerle modül düzeyinde bir isim tanımlayabilir ve başka bir modülde kullanabilirsiniz. Bu, sabitlere veya herhangi bir şeye özgü değildir, modül sisteminde okuyun.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

11

Ve tabii ki şunları yapabilirsiniz:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


3
import * genel olarak tavsiye edilmez, ancak bir kod tabanında yaygın olarak kullanılan C tarzı manifesto sabitleri, onu kullanmanın çılgınca olmadığı yerlerden biridir. Bunları ALL_CAPS'de veya diğer sembollerle çarpışma olasılığını azaltan bazı önek kurallarıyla adlandırmak, deyime yönelik ana itirazı ortadan kaldırır ve bir çarpışma meydana gelirse, her zaman geleneksel içe aktarma + açık ad stiline geri dönebilirsiniz (içe aktarma a; a .MY_CONSTNAT), C.'den farklı olarak
Russell

ayrıca a.MY_CONSTNAT biraz daha yavaş, çünkü yorumlayıcı bir ad alanına 'a' adı ve ardından ikinci bir düşman adı 'MY_CONSTNAT' için bakıyor
Tony

7

Elbette, sabitlerinizi ayrı bir modüle koyabilirsiniz. Örneğin:

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

Yukarıda belirtildiği üzere, bu Not A, Bve Colan değişkenler, yani çalışma zamanında değiştirilebilir.


5

Bakmaya çalışın Bir "ayarlar" modülü kullanarak sabitler oluşturun mu? ve Python'da bir nesneyi değiştirmeyi engelleyebilir miyim?

Bir başka yararlı bağlantı: http://code.activestate.com/recipes/65207-constants-in-python/ bize aşağıdaki seçenek hakkında bilgi verir:

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'

Böylece bunun gibi bir sınıf oluşturabilir ve ardından bunu contants.py modülünüzden içe aktarabilirsiniz. Bu, değerin değişmeyeceğinden, silinmeyeceğinden emin olmanızı sağlayacaktır.


Bunun için teşekkürler. SO sormadan önce her ikisini de aradım ve buldum. :)
SK9

@ SK9 oh, o zaman kopya için özür dilerim
Artsiom Rudzenka

4

Birkaç cevapta açıklanan içe aktarma yaklaşımını kullanmaya alternatif olarak, yapılandırıcıya bir göz atın modülüne .

ConfigParser sınıfı, Microsoft Windows INI dosyalarında bulduğunuza benzer bir yapı sağlayan temel bir yapılandırma dosyası ayrıştırıcı dili uygular. Bunu, son kullanıcılar tarafından kolayca özelleştirilebilen Python programları yazmak için kullanabilirsiniz.


2

Sadece sabit gibi görünen değişkenleri değil, gerçekten sabitleri istiyorsanız, bunu yapmanın standart yolu değişmez sözlükler kullanmaktır. Maalesef henüz yerleşik değil, bu nedenle üçüncü taraf tariflerini ( bunun veya bunun gibi ) kullanmanız gerekir.


2

my_constants.py gibi sabit bir dosya oluştur

CONSTANT_NAME = "SOME VALUE"

Bunun gibi kod içe aktarma dosyanızda sabite erişmek için

import my_constants as constant

ve sabit değere -

constant.CONSTANT_NAME
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.