पायथन फ़ाइल में स्थिरांक की एक लंबी सूची आयात करना


90

पायथन में, क्या 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 लाइन 13 self.someValueOne पर myExample में = Constants.MY_CONSTANT_ONE +1 प्रति उत्पादन कार्यक्रम 0.06 सेकंड के बाद कोड # 1 के साथ बाहर निकल गया।


2
नहीं, कोई प्रीप्रोसेसर नहीं है। और नहीं, आप बहुत दूर पायथन में सी कोड करने की कोशिश कर रहा है, या यहां तक ​​कि समानताएं खोजने की कोशिश नहीं करेंगे।

यह पूर्ण ट्रेसबैक नहीं है। आप इसे कैसे चला रहे हैं? python myExample.pyत्रुटि पर एक ट्रेसबैक देना चाहिए जिसमें फ़ाइल नाम और <module>शीर्ष स्तर शामिल हैं। इसके अलावा, एक वैश्विक नाम के रूप में संदर्भ MY_CONSTANT_ONE नहीं है - वास्तव में अजीब है। ट्रिपल-चेक करें कि वे वास्तव में आपके द्वारा चलाई जा रही फाइलें हैं (और शायद उन्हें ASCII में कनवर्ट करें और # encoding: utf8बिट को स्ट्रिप करें )।

@ सभी: धन्यवाद, मैं अब ठीक लग रहा हूं - अभी तक निश्चित नहीं कि क्यों, लेकिन कभी भी मन नहीं लगा :)।
SK9

जवाबों:


131

अजगर पूर्वप्रकृत नहीं है। आप बस एक फ़ाइल बना सकते हैं myconstants.py:

MY_CONSTANT = 50

और उन्हें आयात करना सिर्फ काम करेगा:

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9: ठीक है, ठीक वही कोड दिखाएं जो आप चला रहे हैं (मॉड्यूल को परिभाषित और उपयोग करना दोनों)।

@Thomas: ऊपर देखें। मैं निश्चित रूप से कुछ चूक गया हूँ जहाँ मैं मूल बातें सीख रहा हूँ।
SK9

@ SK9: आपके द्वारा पोस्ट किए गए कोड में ऐसी कोई त्रुटि नहीं है। मैंने कई बार इसकी जाँच की और इसे स्वयं चलाया, यह ठीक काम करता है। यह भी इस त्रुटि को जन्म नहीं दे सकता है (नाम का कोई संदर्भ नहीं है MAX_FIVE_FLUSH_KEY_INT)। ट्रेसबैक पोस्ट करें।

@ थोमस: इस परीक्षण के लिए धन्यवाद। हम्म, मैं फिर से कोशिश करूँगा। (जिस संदर्भ का उल्लेख किया गया है वह एक टाइपो है।) आपने फ़ाइलों की शाब्दिक रूप से कोशिश की है? (मैंने ऊपर पूरी सामग्री कॉपी और पेस्ट की।)
SK9

@ SK9: मैं थॉमस नहीं हूं;) और हां, मैंने सब कुछ कॉपी और पेस्ट किया, मैंने फिल्नाम को वैसे ही छोड़ दिया जैसे वे हैं। फिर, ट्रेसबैक हमें डीबग करने में मदद करेगा।

18

पाइथन में प्रीप्रोसेसर नहीं है, और न ही इस अर्थ में स्थिरांक है कि उन्हें बदला नहीं जा सकता है - आप हमेशा बदल सकते हैं (लगभग, आप निरंतर ऑब्जेक्ट गुणों का अनुकरण कर सकते हैं, लेकिन निरंतर-नेस के लिए ऐसा करना शायद ही कभी होता है। किया गया और उपयोगी नहीं माना गया) सब कुछ। किसी स्थिरांक को परिभाषित करते समय, हम एक ऐसे नाम को परिभाषित करते हैं, जो अपर केस-के-अंडरस्कोर है और इसे एक दिन कहते हैं - "हम सभी यहां वयस्कों की सहमति दे रहे हैं", कोई भी समझदार आदमी एक स्थिरांक को नहीं बदलेगा। जब तक निश्चित रूप से उसके पास बहुत अच्छे कारण हैं और जानता है कि वास्तव में वह क्या कर रहा है, जिस स्थिति में आप (और संभवतः नहीं) उसे किसी भी तरह से रोक नहीं सकते हैं।

लेकिन निश्चित रूप से आप एक मॉड्यूल-स्तरीय नाम को एक मान के साथ परिभाषित कर सकते हैं और इसे दूसरे मॉड्यूल में उपयोग कर सकते हैं। यह स्थिरांक या कुछ भी विशिष्ट नहीं है, मॉड्यूल सिस्टम पर पढ़ा जाता है।

# 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
आयात * को सामान्य रूप से हतोत्साहित किया जाता है, लेकिन सी-स्टाइल मैनिफ़ेस्ट कॉन्स्टेंट जो व्यापक रूप से एक कोडबेस में उपयोग किए जाते हैं, उन स्थानों में से एक हैं जहां इसका उपयोग करने के लिए पागल नहीं है। ALL_CAPS में या कुछ उपसर्ग कन्वेंशन के साथ उनका नामकरण जो अन्य प्रतीकों के साथ टकराव की संभावना को कम करता है, मुहावरे पर मुख्य आपत्ति को हटाता है, और यदि कोई टकराव होता है, तो आप हमेशा पारंपरिक आयात + स्पष्ट शैली (आयात a) में वापस आ सकते हैं; .MY_CONSTNAT), सी। के विपरीत
रसेल बोरोगोव

a.MY_CONSTNAT थोड़ा धीमा भी है, ऐसा इसलिए है क्योंकि दुभाषिया 'नाम' के लिए एक नामस्थान में देख रहा है और फिर दूसरे एक दुश्मन के नाम पर 'MY_CONSTNAT'
टोनी

7

ज़रूर, आप अपने स्थिरांक को एक अलग मॉड्यूल में डाल सकते हैं। उदाहरण के लिए:

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

नोट के रूप में ऊपर की घोषणा की, कि A, Bऔर Cचर हैं, यानी रन टाइम पर बदला जा सकता है।


5

एक "सेटिंग" मॉड्यूल का उपयोग करके कॉन्स्टेंट बनाने की कोशिश करें ? और क्या मैं पायथन में किसी वस्तु को संशोधित करने से रोक सकता हूं?

एक अन्य उपयोगी लिंक: 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

@ SK9 ओह, डुप्लिकेट के लिए खेद है तो
Artiom Rudzenka

4

कई उत्तरों में वर्णित आयात दृष्टिकोण का उपयोग करने के लिए एक विकल्प के रूप में, एक विन्यासकर्ता मॉड्यूल है।

ConfigParser वर्ग एक मूल कॉन्फ़िगरेशन फ़ाइल पार्सर भाषा को लागू करता है, जो आपको Microsoft Windows INI फ़ाइलों पर मिलने वाली संरचना के समान है। आप इसका उपयोग पायथन प्रोग्राम लिखने के लिए कर सकते हैं जिसे अंत उपयोगकर्ताओं द्वारा आसानी से अनुकूलित किया जा सकता है।


2

यदि आप वास्तव में स्थिरांक चाहते हैं, तो केवल स्थिरांक की तरह दिखने वाले चर नहीं हैं, ऐसा करने का मानक तरीका अपरिवर्तनीय शब्दकोशों का उपयोग करना है। दुर्भाग्य से यह बिल्ट-इन अभी तक नहीं है, इसलिए आपको तीसरे पक्ष के व्यंजनों (जैसे यह एक या एक ) का उपयोग करना होगा।


2

my_constants.py जैसे किसी भी नाम के साथ निरंतर फ़ाइल बनाएं जैसे कि निरंतर घोषित करेगा

CONSTANT_NAME = "SOME VALUE"

अपने कोड आयात फ़ाइल में निरंतर पहुंच के लिए जैसे

import my_constants as constant

और निम्न मान तक पहुँचें -

constant.CONSTANT_NAME
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.