আমি কীভাবে বর্তমান মডিউলটিতে সেটট্র্যাট () কল করব?


140

বর্তমান মডিউলে ভেরিয়েবল সেট objectকরতে আমি ফাংশনে প্রথম পরামিতি হিসাবে কী পাস করব setattr(object, name, value)?

উদাহরণ স্বরূপ:

setattr(object, "SOME_CONSTANT", 42);

হিসাবে একই প্রভাব প্রদান:

SOME_CONSTANT = 42

এই লাইনগুলি সহ সঠিক মডিউলটির মধ্যে (সঠিক সহ object)।

আমি গতিশীলভাবে মডিউল স্তরে বিভিন্ন মান উত্পন্ন করছি এবং মডিউল স্তরে আমি সংজ্ঞা দিতে পারি না __getattr__, এটি আমার ফ্যালব্যাক।

উত্তর:


220
import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

বা, ব্যবহার না করে setattr(যা প্রশ্নের চিঠিটি ভেঙে দেয় তবে একই ব্যবহারিক উদ্দেশ্যকে সন্তুষ্ট করে ;-):

globals()[name] = value

দ্রষ্টব্য : মডিউল স্কোপে, পরবর্তীটি সমান:

vars()[name] = value

যা কিছুটা সংক্ষিপ্ত, তবে কোনও ফাংশনের মধ্যে থেকে কাজ করে না ( vars()যে স্কোপটিতে এটি বলা হয় তার ভেরিয়েবলগুলি দেয়: মডিউলটির ভেরিয়েবলগুলি যখন বৈশ্বিক সুযোগে ডাকা হয়, এবং তারপরে এটি আর / ডাব্লু ব্যবহার করা ঠিক আছে, তবে ফাংশনটির ভেরিয়েবলগুলি যখন কোনও ফাংশনে ডাকা হয় এবং তারপরে এটি অবশ্যই আর / ও হিসাবে বিবেচিত হয় - পাইথন অনলাইন ডক্স এই নির্দিষ্ট পার্থক্য সম্পর্কে কিছুটা বিভ্রান্ত হতে পারে)।


9
দস্তাবেজগুলি ভার () পরিবর্তন করার বিষয়ে একটি সতর্কতা দেয়। docs.python.org/library/functions.html#vars । কখন এটা করা ঠিক হবে?
আনটবু

2
@ ut আনবুবু, আমি সত্যিই এটি বলব না যে এটি বেশ "ঠিক আছে", তবে আপনি যখন vars()কোনও ফাংশনের অভ্যন্তরের পরিবর্তে মডিউল-স্তরের স্কোপগুলিতে কল করবেন তখন এটি কার্যকর হবে ।
মাইক গ্রাহাম

4
vars()globals()মডিউল স্কোপের সমতুল্য (এবং সুতরাং এটি একটি সত্য, সংশোধনযোগ্য ডিক ফেরায়) তবে locals()ফাংশন স্কোপে (এবং তাই কোনও-না-হতে-পরিবর্তিত সিউডোক্টিক্ট ফেরত দেয়)। আমি vars()মডিউল স্কোপে এটি ব্যবহার করি কারণ এটি 3 অক্ষর সংরক্ষণ করে, একটি উচ্চারণযোগ্য, এর সমার্থক-ইন-দ্য স্কোপটি globals();-)
অ্যালেক্স মার্টেলি

14
হ্যাঁ, এটি পাইথন সংকলকটির একক গুরুত্বপূর্ণ অপটিমাইজেশনটি ধ্বংস করে দিত: কোনও ফাংশনের স্থানীয় ভেরিয়েবলগুলি ডিকের মধ্যে রাখা হয় না , তারা মানগুলির একটি শক্ত ভেক্টরে থাকে এবং প্রতিটি স্থানীয় পরিবর্তনীয় অ্যাক্সেস সেই ভেক্টরের সূচকটি ব্যবহার করে, না একটি নাম অনুসন্ধান। অপ্টিমাইজেশানকে পরাভূত করতে, আপনি যে ডিকটির অস্তিত্ব রাখতে চান তা জোর করে, ফাংশনটি এটির সাথে শুরু করুন exec '': সময়টি কয়েক দফা বেশ কয়েকটি লুপের সাথে একটি ফাংশন শুরু করুন এবং আপনি পাইথনের পারফরম্যান্সে এই মূল অপ্টিমাইজেশনের গুরুত্ব দেখতে পাবেন।
অ্যালেক্স মার্তেলি

3
@ এমএসডাব্লু, আমার মনে হয় আপনি "ব্যবহারিকতা বিশুদ্ধ করেছেন" ;-)।
অ্যালেক্স মার্টেলি

6

আপনি যদি মডিউলের মধ্যে থেকেই মডিউল স্কোপড ভেরিয়েবলগুলি সেট করতে পারেন তবে এতে কী সমস্যা global?

# my_module.py

def define_module_scoped_variables():
    global a, b, c
    a, b, c = 'a', ['b'], 3

এইভাবে:

>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']

1
হ্যাঁ, আমি সর্বদা (যেখানে "সর্বদা" "পাইথন শিখছি" গত কয়েক মাস হিসাবে সংজ্ঞায়িত হয়েছে) সেই global but not reallyঘোষণাকে হতাশ করে। আমি মনে করি এটি একটি historicalতিহাসিক ধ্বংসাবশেষ যা মডিউল নেমস্পেসগুলি পূর্বাভাস দেয়।
এমএসডাব্লু

1
মূল প্রশ্নটি জিজ্ঞাসা করছে যে কোনও নামটি স্ট্রিংয়ের মাধ্যমে দেওয়া হয়েছে এমন একটি বৈশিষ্ট্য কীভাবে সেট করবেন (একইভাবে আমি বর্তমানে সন্ধান করছিলাম), সুতরাং এটি কোনও সাহায্য করবে না।
কর্ট


-1
  1. আপনি না। আপনি করবেনglobals()["SOME_CONSTANT"] = 42
  2. আপনি না। আপনি মডিউল ব্যতীত অন্য কোথাও গতিশীল উত্পন্ন সামগ্রী সংরক্ষণ করবেন।

হ্যাঁ, SOME_CONSTANTরান-টাইমে গণনা করা ঠিক ধ্রুবক নয়। এবং যদি আপনার globals()কাছে উপলভ্য না হয় তবে এর বৈশিষ্ট্যগুলি সংশোধন করতে আপনাকে অবশ্যই অন্য মডিউলে পৌঁছতে হবে; এটি মানুষকে ভাবতে বাধ্য করে।
এমএসডাব্লু

3
ধ্রুবক এবং পরিবর্তনীয় পারস্পরিক একচেটিয়া। ধ্রুবক এবং গতিশীলভাবে উত্পাদিত হয় না। আমার পক্ষ থেকে পাটিগণিত এবং টাইপিংয়ের জন্য সংরক্ষণ করার জন্য আমি যে মানগুলি উত্পন্ন করছি তা সর্বদা একই এবং আরও "ধ্রুবক" এর উপর ভিত্তি করে নির্ধারিত হয়।
ম্যাট জয়েনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.