পাইথন ফাইলে কনস্ট্যান্টের দীর্ঘ তালিকা আমদানি করা হচ্ছে


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()

সম্পাদনা করুন

সংকলক থেকে,

নামের ত্রুটি: "বিশ্বব্যাপী নাম 'MY_CONSTANT_ONE' সংজ্ঞায়িত করা হয়নি"

ফাংশন Init লাইন 13 self.someValueOne এ myExample মধ্যে = Constants.MY_CONSTANT_ONE +1 কপি আউটপুট প্রোগ্রাম 0.06 সেকেন্ড পরে কোড # 1 প্রস্থান করেছে।


4
না, কোনও প্রিপ্রসেসর নেই। এবং না, আপনি পাইথনে সি কোড দেওয়ার খুব বেশি চেষ্টা করবেন না, এমনকি সমান্তরাল সন্ধান করার চেষ্টাও করবেন না।

এটি পুরো ট্রেসব্যাক নয়। আপনি এটি কিভাবে চালাচ্ছেন? python myExample.pyফাইলের নাম এবং <module>শীর্ষ স্তরের হিসাবে ত্রুটিতে একটি ট্রেসব্যাক দেওয়া উচিত । এছাড়াও, বিশ্বব্যাপী নাম হিসাবে উল্লেখগুলি MY_CONSTANT_ONE নয় - সত্যই অদ্ভুত। ট্রিপল-পরীক্ষা করে দেখুন যে সেগুলি আসলে আপনি যে ফাইলগুলি চালাচ্ছেন সেগুলি (এবং সম্ভবত এএসসিআইআইতে রূপান্তর করুন এবং # encoding: utf8বিটটি সরিয়ে দিন)।

@ সমস্ত: ধন্যবাদ, আমি এখন ঠিকঠাক বলে মনে করি - এখনও নিশ্চিত নয় কেন, তবে কিছু মনে করবেন না :)।
এসকে 9

উত্তর:


132

পাইথন প্রিপ্রোসেসড নয়। আপনি কেবল একটি ফাইল তৈরি করতে পারেন myconstants.py:

MY_CONSTANT = 50

এবং এগুলি আমদানি করা কেবল কাজ করবে:

import myconstants
print myconstants.MY_CONSTANT * 2

@ এসকে 9: ভাল, আপনি যে সঠিক কোডটি চালাচ্ছেন তা দেখান (মডিউলটি সংজ্ঞায়িত এবং ব্যবহার উভয়)।

@ থমাস: উপরে দেখুন। আমি স্পষ্টতই কিছু কিছু মিস করেছি যেখানে আমি বেসিকগুলি শিখছি।
এসকে 9

@ এসকে 9: আপনার পোস্ট করা কোডটিতে এমন কোনও ত্রুটি নেই। আমি এটি বেশ কয়েকবার যাচাই করেছি এবং নিজে চালিয়েছি, এটি ঠিক কাজ করে। এটি এমনকি এই ত্রুটির দিকে পরিচালিত করতে পারে না (কোনও নামের কোনও রেফারেন্স নেই MAX_FIVE_FLUSH_KEY_INT)। ট্রেসব্যাক পোস্ট করুন।

@ থমাস: এটি পরীক্ষা করার জন্য ধন্যবাদ। হুম, আমি আবার চেষ্টা করব। (যাঁকে দেওয়া রেফারেন্সটি টাইপো is (আমি উপরের সম্পূর্ণ বিষয়বস্তু অনুলিপি করে
আটকালাম

@ এসকে 9: আমি থমাস নই;) এবং হ্যাঁ, আমি সমস্ত কিছু অনুলিপি করে আটকিয়েছি, এমনকি ফাইলের নামগুলি সেখান থেকে রেখে দিয়েছি। আবার, ট্রেসব্যাক আমাদের ডিবাগ করতে সহায়তা করবে।

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


4
আমদানি * সাধারণভাবে নিরুৎসাহিত করা হয়, তবে সি-স্টাইলের ম্যানিফেস্ট কনস্ট্যান্টগুলি যা কোনও কোডবেজ জুড়ে বহুলভাবে ব্যবহৃত হয় এটি এমন একটি জায়গা যেখানে এটি ব্যবহার করা উন্মাদ নয়। তাদের ALL_CAPS এ নামকরণ করা বা কিছু উপসাগরীয় কনভেনশনের সাথে নামকরণ যা অন্যান্য চিহ্নগুলির সাথে সংঘর্ষের সম্ভাবনা হ্রাস করে আইডিয়মের মূল আপত্তিটি সরিয়ে দেয় এবং যদি কোনও সংঘর্ষ হয় তবে আপনি সর্বদা প্রচলিত আমদানি + সুস্পষ্ট নাম শৈলীতে ফিরে যেতে পারেন (আমদানি; একটি; .MY_CONSTNAT), সি এর থেকে আলাদা নয়
রাসেল বোরোগোভ

এছাড়াও a.MY_CONSTNAT কিছুটা ধীরে ধীরে, কারণ দোভাষী তার একটি নামের জন্য 'এ' নাম এবং পরে দ্বিতীয় শত্রুটির নাম 'MY_CONSTNAT'
টনি

7

অবশ্যই, আপনি আপনার ধ্রুবকগুলি একটি পৃথক মডিউলে রাখতে পারেন। উদাহরণ স্বরূপ:

কনস্টিপি:

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/recines/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 মডিউলটি আমদানি করতে পারেন। এটি আপনাকে নিশ্চিত হতে দেয় যে মানটি কোনও পরিবর্তন হবে না, মোছা হবে না।


এর জন্য ধন্যবাদ. এসও জিজ্ঞাসা করার আগে আমি উভয়টি অনুসন্ধান করে খুঁজে পেয়েছি। :)
এসকে 9

@ এস কে 9 ওহ, নকলের জন্য দুঃখিত তাই
আর্টসিয়াম রুডজেনকা

4

বেশ কয়েকটি উত্তরে বর্ণিত আমদানি পদ্ধতির ব্যবহারের বিকল্প হিসাবে কনফিগার পার্সার মডিউলটি দেখুন।

কনফিগার পার্সার ক্লাসটি একটি বেসিক কনফিগারেশন ফাইল পার্সার ল্যাঙ্গুয়েজ প্রয়োগ করে যা মাইক্রোসফ্ট উইন্ডোজ আইএনআই ফাইলগুলিতে আপনি দেখতে পাবেন তার মতো কাঠামো সরবরাহ করে। আপনি পাইথন প্রোগ্রাম লিখতে এটি ব্যবহার করতে পারেন যা শেষ ব্যবহারকারীরা সহজেই কাস্টমাইজ করতে পারেন।


2

যদি আপনি সত্যিই ধ্রুবকগুলি চান তবে কেবল পরিবর্তনশীলগুলি ধ্রুবকগুলির মতো দেখায় না, এটি করার মানক উপায় হ'ল অপরিবর্তনীয় অভিধানগুলি ব্যবহার করা। দুর্ভাগ্যবশত এটা বিল্ট-ইন এর এখনো, তাই আপনি তৃতীয় পক্ষের রেসিপি (যেমন ব্যবহার করতে হবে এই এক বা যে এক )।


2

my_constants.py এর মতো যে কোনও নামের সাথে ধ্রুবক ফাইল তৈরি করুন constant

CONSTANT_NAME = "SOME VALUE"

আপনার কোড ইম্পোর্ট ফাইলটিতে ধ্রুবক অ্যাক্সেসের জন্য

import my_constants as constant

এবং হিসাবে ধ্রুবক মান অ্যাক্সেস -

constant.CONSTANT_NAME
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.