স্ট্রিং হিসাবে ভেরিয়েবলের নাম পাওয়া


173

এই থ্রেডটি আলোচনা করে যে পাইথনে স্ট্রিং হিসাবে কোনও ফাংশনের নাম কীভাবে পাওয়া যায় : স্ট্রিং হিসাবে কোনও ফাংশনের নাম কীভাবে পাওয়া যায়?

আমি একটি পরিবর্তনশীল জন্য একই কি করতে পারেন? ফাংশনগুলির বিপরীতে পাইথন ভেরিয়েবলগুলির __name__বৈশিষ্ট্য নেই।

অন্য কথায়, আমার যদি ভেরিয়েবল থাকে যেমন:

foo = dict()
foo['bar'] = 2

আমি একটি ফাংশন / বৈশিষ্ট্য খুঁজছি, উদাহরণস্বরূপ এই তালিকা থেকে পান্ডসে ডেটা ফ্রেম তৈরিretrieve_name() করার জন্য , যেখানে কলামের নামগুলি প্রকৃত অভিধানের নাম দিয়ে দেওয়া হয়েছে:

# List of dictionaries for my DataFrame
list_of_dicts = [n_jobs, users, queues, priorities]
columns = [retrieve_name(d) for d in list_of_dicts] 

উত্তর:


18

python-varnameপ্যাকেজটি ব্যবহার করে আপনি সহজেই ভেরিয়েবলের নাম পুনরুদ্ধার করতে পারেন

https://github.com/pwwang/python-varname

আপনার ক্ষেত্রে, আপনি এটি করতে পারেন:

from varname import Wrapper

foo = Wrapper(dict())

# foo.name == 'foo'
# foo.value == {}
foo.value['bar'] = 2

অথবা আপনি সরাসরি চলক নামটি পুনরুদ্ধার করতে পারেন:

from varname import nameof

foo = dict()

fooname = nameof(foo)
# fooname == 'foo'

আমি এই প্যাকেজের লেখক। আপনার যদি কোন প্রশ্ন থাকে বা আপনি গিথুব এ সমস্যা জমা দিতে পারেন দয়া করে আমাকে জানান।


2
ঠিক আছে, শেষ পর্যন্ত! নিম্নলিখিত ব্যবহার করে ইনস্টল করা pip3 install python-varname==0.1.5; আমদানি করুনfrom varname import nameof
enter_display_name_ এখানে

একরকম ফাংশনটি কোনও লুপে কাজ করে না: test = {} print(varname.nameof(test)) for i in [0]: print(varname.nameof(test))প্রথম মুদ্রণটি দেয় test, লুপের VarnameRetrievingError: Callee's node cannot be detected.
মুদ্রণটি

1
@ টিলাস ফিক্সড এv0.2.0
পানওয়েন ওয়াং

106

পাইথনের একমাত্র অবজেক্টের ক্যানোনিকাল নামগুলি হল মডিউল, ফাংশন এবং ক্লাসগুলি এবং অবশ্যই কোনও গ্যারান্টি নেই যে ফাংশন বা শ্রেণিটি সংজ্ঞায়িত হওয়ার পরে বা মডিউলটি আমদানীকৃত হওয়ার পরে এই নামক কোনও নামস্থানে কোনও অর্থ রয়েছে। এই নামগুলি বস্তু তৈরির পরেও সংশোধন করা যেতে পারে যাতে তারা সর্বদা বিশেষভাবে বিশ্বাসযোগ্য না হয়।

আপনি যা করতে চান নামকৃত বস্তুর গাছকে অবিচ্ছিন্নভাবে হাঁটা ছাড়া সম্ভব নয় ; নাম একটি বস্তুর একতরফা রেফারেন্স। একটি সাধারণ বা উদ্যান-ধরণের পাইথন অবজেক্টে এর নামের সাথে কোনও উল্লেখ নেই। কল্পনা করুন যে প্রতিটি পূর্ণসংখ্যার, প্রতিটি ডিক্ট, প্রতিটি তালিকা, প্রতিটি বুলিয়ানকে তার উল্লেখ করা নামগুলির প্রতিনিধিত্ব করে এমন স্ট্রিংগুলির একটি তালিকা বজায় রাখা দরকার! এটি একটি বাস্তবায়ন দুঃস্বপ্ন হতে পারে, প্রোগ্রামারটির সামান্য উপকার সহ।


7
ধন্যবাদ। তবে পাইথন তখন ফাংশনগুলির জন্য কেন এটি করে? (অর্থাত্ এক ধরণের পাইথন অবজেক্টস)
অমেলিও ওয়াজকেজ-রেইনা

1
@ জিনডাল: মডিউলগুলি ভুলে যাবেন না: তাদের নামও প্রচলিত রয়েছে। এছাড়াও, ভুলে যাবেন না যে __name__সর্বদা সংশোধন করা যেতে পারে, এর অর্থ হল "ক্যানোনিকাল" নামটি এমন কোনও নাম নাও হতে পারে যা বস্তুটি পেতে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ, যখন গতিশীলভাবে ক্লাস তৈরি করার সময়)।
nneonneo

8
আপনার বক্তব্য "এটি সহজভাবে সম্ভব নয়" মিথ্যা, যেমন @ scohe001 দেখিয়েছে । পাইথনের ভেরিয়েবল নামের ডাটাবেসটি অন্য যে কোনও রিলেশনাল ডিবির মতো, আপনি সর্বদা সম্পর্কিত বিষয়গুলি "বিপরীতে" অনুসন্ধান করতে পারেন এবং কোনও পাওয়া ভেরিয়েবলের জন্য প্রথম পাওয়া বা বৈধ ভেরিয়েবল নামের পুরো সেটটি ফিরিয়ে দিতে পারেন।
13:53

3
@ হবস আপনি প্রযুক্তিগতভাবে সঠিক ... সর্বোত্তম ধরণের সঠিক। বাস্তবে, তবে কোনও সামগ্রীর জন্য অনেকগুলি সম্ভাব্য নাম রয়েছে যেগুলি পাওয়ার চেষ্টা করার চেয়ে এটির চেয়ে বেশি সমস্যা।
kindall

1
@ জ্যানডল আমি অনুমান করি যে আপনার "মূল্যবান" থ্রেশহোল্ড যদি ও (1) হয় তবে আপনি ঠিক বলেছেন। scohe001 এর লুপটি O (N) হবে।
hobs 18

82

এমনকি যদি ভেরিয়েবলের মানগুলি নামের দিকে ফিরে না আসে, আপনি প্রতিটি নির্ধারিত ভেরিয়েবলের তালিকা এবং এর মানটি অ্যাক্সেস করতে পারেন, তাই আমি অবাক হয়েছি যে কেবলমাত্র একজন ব্যক্তি আপনার বর্ণের নাম সন্ধান করার জন্য সেখানে লুপিংয়ের পরামর্শ দিয়েছিল।

কেউ যে উত্তর আপনি এটি স্ট্যাক পরীক্ষক সকলের স্থানীয় এবং globals হেঁটে যাওয়ার থাকতে পারে যে উল্লেখ করা foo, কিন্তু যদি fooসুযোগ নির্ধারিত হয় যেখানে আপনি এই আহ্বান করছি retrieve_nameফাংশন, আপনি ব্যবহার করতে পারেন inspects 'এরcurrent frame আপনি ঐ স্থানীয় ভেরিয়েবল সব পেতে ।

আমার ব্যাখ্যাটি কিছুটা শব্দযুক্ত হতে পারে (সম্ভবত আমার "foo" কম শব্দ ব্যবহার করা উচিত ছিল) তবে কোডটিতে এটি কীভাবে দেখাবে তা এখানে দেখুন ( নোট করুন যদি একই মানের জন্য একাধিক ভেরিয়েবল নির্ধারিত থাকে তবে আপনি এই পরিবর্তনশীল নাম দুটিই পান ):

import inspect

x,y,z = 1,2,3

def retrieve_name(var):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()
    return [var_name for var_name, var_val in callers_local_vars if var_val is var]

print retrieve_name(y)

আপনি যদি অন্য ফাংশন থেকে এই ফাংশনটি কল করছেন, এমন কিছু:

def foo(bar):
    return retrieve_name(bar)

foo(baz)

এবং এর bazপরিবর্তে আপনি চান bar, আপনাকে কেবল আরও একটি সুযোগ ফিরে যেতে হবে। এটি একটি অতিরিক্ত যোগ করে কাজ করা যেতে পারে .f_backযে caller_local_varsআরম্ভের।

এখানে একটি উদাহরণ দেখুন: আদর্শ


1
@theodox আমি একেবারে একমত, হিসাবে এই সম্ভবত আপ কাজ করবে import hooks, ironpythonএবংjython
scohe001

5
এটি কাজ করবে না। পারমাণবিক ভেরিয়েবলগুলির বৈশিষ্ট্য হিসাবে তাদের নাম নেই। সুতরাং আপনি আছে যদি a, b = 2, 2, retrieve_name(a)এবং retrieve_name(b)হবে উভয় রিটার্ন ['a', 'b']বা['b', 'a']
Tomas

1
@ টমাস প্রকৃতপক্ষে, এটি সিপাইথনের একটি অপ্টিমাইজেশনের একটি বাস্তবায়নের বিশদ যা 255 এর নীচে পূর্ণসংখ্যাগুলি মূলত সিঙ্গেলন, সুতরাং সেই মানগুলি নির্ধারিত যে কোনও ভেরিয়েবল কার্যকরভাবে trueএকটি isতুলনার জন্য ফিরে আসবে
টোটোট

1
পাসের ভেরির নাম পাওয়ার জন্য কি এর কোনও মোড আছে? উদাহরণস্বরূপ def foo(bar): retrieve_name(bar)সর্বদা বার ফিরে আসবে, তবে আপনি যদি foo(baz)ফিরে আসতে চান baz) তবে পরিবর্তে barকী হবে ?
SumNeuron

1
@ সুমনিউরন আপনাকে কেবল সেই লাইনটি সংশোধন করতে হবে যা একটি স্কোপকে callers_local_varsআরও পিছনে পিছনে যেতে দেয় তাই এটি যা ডাকা হচ্ছে তার সুযোগটি সন্ধান করবে foo। লাইনটি পরিবর্তন করতে inspect.currentframe().f_back.f_back.f_locals.items()(অতিরিক্ত লক্ষ্য করুন f_back)।
scohe001

36

পাইথন ৩.৮ এর সাহায্যে কেউ এফ স্ট্রিং ডিবাগিং বৈশিষ্ট্যটি সহজেই ব্যবহার করতে পারেন:

>>> foo = dict()
>>> f'{foo=}'.split('=')[0]
'foo' 

সুন্দর! এবং কেবলমাত্র আপনি যদি কোনও f'{foo=}'.split('=')[0].split('.')[-1]
জিনিসের

30

পাইথন 3-এ, এই ফাংশনটি স্ট্যাকের বাইরের সর্বাধিক নামটি পাবেন:

import inspect


def retrieve_name(var):
        """
        Gets the name of var. Does it from the out most frame inner-wards.
        :param var: variable to get name from.
        :return: string
        """
        for fi in reversed(inspect.stack()):
            names = [var_name for var_name, var_val in fi.frame.f_locals.items() if var_val is var]
            if len(names) > 0:
                return names[0]

এটি কোডের যে কোনও জায়গায় কার্যকর। বিপরীত স্ট্যাকটিকে প্রথম ম্যাচের জন্য সন্ধান করে Tra


চমৎকার কাজ! যদিও আমি চেষ্টা retrieve_name(SomeClass.some_attribute)করি এটি কার্যকর হয় না। আপনি কি আরও সাহায্য করতে পারেন?
নাম জি ভিউ

এটি বুলিয়ান ভেরিয়েবলগুলির সাথে লড়াই করে। আমি শেষ করছিstop_on_error
SumNeuron

26

আমি বিশ্বাস করি না এটি সম্ভব। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

>>> a = []
>>> b = a
>>> id(a)
140031712435664
>>> id(b)
140031712435664

aএবং bএকই বস্তুর বিন্দু, কিন্তু বস্তুর কি ভেরিয়েবল তা নির্দেশ জানতে পারে না।


2
রেফারেন্স গণনা প্রসারিত করে অবশ্যই সম্পর্কটিকে দ্বি-মুখী করা যায় । এই উত্তরটি (এবং আরও কিছু) এমনকি একটি বাস্তবায়ন সরবরাহ করে।
শায়ান

17
def name(**variables):
    return [x for x in variables]

এটি এভাবে ব্যবহার করা হয়:

name(variable=variable)

12
এটি পছন্দসই ভেরিয়েবলের নাম ফিরিয়ে দেবে না, তবে "ভেরিয়েবল"। উদাহরণস্বরূপ - name(variable=variable)উইল আউটপুট ব্যবহার করা ['variable'], এবং ব্যবহারের name(variable=another_variable)ফলে আউটপুট হবে না['another_variable'] বরং ['variable']
ডাল্যাজি

1
আসলে এটি প্রত্যাশার মতো কাজ করে। আপনাকে কেবল আপনার ভেরিয়েবলের সাথে উভয় «পরিবর্তনশীল replace গুলি প্রতিস্থাপন করতে হবে। এটি প্রথম ভেরিয়েবলের নামের একটি স্ট্রিং সহ একটি এক-উপাদান তালিকা ফিরে আসবে । উদাহরণস্বরূপ: >>> a = [] >>> b = a >>> name(a=b) ['a'] >>> name(b=a) ['b']`
অ্যালগিয়াম মেগলা

8

এখানে একটি পদ্ধতির। আমি এটি কোনও গুরুত্বপূর্ণ বিষয়গুলির জন্য সুপারিশ করব না, কারণ এটি বেশ ভঙ্গুর হবে। তবে তা করা যায়।

এমন একটি ফাংশন তৈরি করুন যা inspectমডিউলটিকে এটির নামক উত্স কোডটি সন্ধান করতে ব্যবহার করে। তারপরে আপনি যে পরিবর্তনশীল নামগুলি পুনরুদ্ধার করতে চান তা সনাক্ত করতে আপনি উত্স কোডটি পার্স করতে পারেন। উদাহরণস্বরূপ, এখানে একটি ফাংশন বলা হয় autodictযা ভেরিয়েবলগুলির একটি তালিকা গ্রহণ করে এবং তাদের মানগুলিতে ভেরিয়েবলের নাম ম্যাপিংয়ের একটি অভিধান প্রদান করে। উদাহরণ:

x = 'foo'
y = 'bar'
d = autodict(x, y)
print d

দিতে হবে:

{'x': 'foo', 'y': 'bar'}

উত্স কোডটি নিজেই পরীক্ষা করা অনুসন্ধানের মাধ্যমে অনুসন্ধান করা locals()বা globals()কারণ পরবর্তী পদ্ধতি আপনাকে জানায় না যে কোনটি ভেরিয়েবল আপনি চান।

যে কোনও হারে, এখানে কোড:

def autodict(*args):
    get_rid_of = ['autodict(', ',', ')', '\n']
    calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
    calling_code = calling_code[calling_code.index('autodict'):]
    for garbage in get_rid_of:
        calling_code = calling_code.replace(garbage, '')
    var_names, var_values = calling_code.split(), args
    dyn_dict = {var_name: var_value for var_name, var_value in
                zip(var_names, var_values)}
    return dyn_dict

ক্রিয়াটি লাইনের সাথে সংঘটিত হয় inspect.getouterframes, যা ডাকে কোডের মধ্যে স্ট্রিং দেয় autodict

এই ধরণের যাদুটির সুস্পষ্ট নেতিবাচকতা হ'ল এটি উত্স কোডটি কীভাবে কাঠামোগত হয় সে সম্পর্কে অনুমানগুলি তৈরি করে। এবং অবশ্যই, এটি কোনও কাজ করে না যদি এটি দোভাষীর ভিতরে চলে।


হ্যালো, আমার কাছে কেবল তিনটি প্রশ্ন রয়েছে: 1. "1" কেন? 2. "4" কেন? 3. কেন "0"? :)
পাইটর ওয়াসেলিউইচ

7

এই ধরণের যাদুটি দৃ rob়তার সাথে করার জন্য আমি প্যাকেজ জাদু লিখেছিলাম । তুমি লিখতে পারো:

from sorcery import dict_of

columns = dict_of(n_jobs, users, queues, priorities)

এবং এটি ডেটা ফ্রেম কনস্ট্রাক্টরকে দিন। এটি এর সমতুল্য:

columns = dict(n_jobs=n_jobs, users=users, queues=queues, priorities=priorities)

6
>>> locals()['foo']
{}
>>> globals()['foo']
{}

আপনি যদি নিজের ফাংশনটি লিখতে চান, এটি এমনভাবে করা যেতে পারে যে আপনি স্থানীয়দের মধ্যে সংজ্ঞায়িত একটি পরিবর্তনশীল পরীক্ষা করতে পারেন তবে গ্লোবালগুলি পরীক্ষা করতে পারেন। যদি কিছু না পাওয়া যায় তবে আপনি আইডির সাথে তুলনা করতে পারবেন () মেমরিতে একই স্থানে পরিবর্তনশীল পয়েন্ট কিনা তা দেখতে।

যদি আপনার ভেরিয়েবল একটি ক্লাসে থাকে তবে আপনি ক্লাসনেম ব্যবহার করতে পারেন। অভি .keys () বা Vars (স্ব) যদি আপনার পরিবর্তনশীল সংজ্ঞায়িত করা হয়েছে দেখতে।


নাম কলার ফ্রেমে থাকলে কী হবে? তারপরে আপনাকে স্ট্যাকের উপর হাঁটা এবং প্রত্যেকের পরীক্ষা করা localsএবং globals... এবং আসলে কিছুই না থাকলে আপনার নামটি ভুল হওয়ার ঝুঁকির মতো নির্বোধ বিষয়গুলি করতে হবে । প্রকৃত কার্যকর লাভের জন্য এটি এক টন কাজ।
nneonneo

পুরো প্রশ্নটি নির্বোধ ... তবে যদি সে কিছু করতে চায় তবে তা সম্ভব। অস্তিত্ব যাচাই করা অবধি আপনি গ্লোবালস () ব্যবহার করতে পারেন। সেটডেফল্ট (var, <টাইপের নতুন ধরণের জিনিস (var)) যখন কিছু নেই তখন কিছু তৈরি করতে। তিনি কী চান তা আমি ঠিক নিশ্চিত নই, তবে হতে পারে ভেরিয়েবলগুলি সুযোগের দ্বারা রাখা হয়েছে তা শিখিয়ে তিনি আরও ভাল কিছু বের করতে পারেন।
ব্লেকভ

3

পাইথনে, defএবং classকীওয়ার্ডগুলি তাদের নির্দিষ্ট করা বস্তুর (ফাংশন বা শ্রেণি) নির্দিষ্ট নাম বাঁধবে। একইভাবে ফাইল সিস্টেমে নির্দিষ্ট কিছু বলার কারণে মডিউলগুলিকে একটি নাম দেওয়া হয়। তিনটি ক্ষেত্রেই, প্রশ্নে থাকা অবজেক্টকে একটি "ক্যানোনিকাল" নাম নির্ধারণ করার একটি সুস্পষ্ট উপায় রয়েছে।

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

পাইথন একটি অ্যাসাইনমেন্টের বাম দিকে নির্ধারিত বস্তুটিতে নাম সংরক্ষণ করে না কারণ:

  1. একাধিক বিবাদমান বস্তুর মধ্যে "নামটি" কী ছিল তা নির্ধারণের জন্য এটি প্রয়োজন হবে,
  2. এটি এমন কোনও অবজেক্টের জন্য কোনও অর্থবোধ করে না যা কোনও সুস্পষ্ট পরিবর্তনশীল নামকে কখনই বরাদ্দ করা হয় না,
  3. এটি চূড়ান্তভাবে অক্ষম হবে,
  4. আক্ষরিক অর্থে অন্য কোনও ভাষা তা করে না।

সুতরাং, উদাহরণস্বরূপ, ব্যবহার করে সংজ্ঞায়িত ফাংশনগুলির একটি নির্দিষ্ট ফাংশন নামের পরিবর্তে lambdaসর্বদা "নাম" থাকবে <lambda>

সবচেয়ে ভাল উপায়টি কেবল কলারকে নামের একটি (alচ্ছিক) তালিকায় পাস করার জন্য বলা হয়। যদি টাইপটি '...','...'খুব জটিল হয় তবে আপনি গ্রহণ করতে পারেন যেমন একটি একক স্ট্রিং কমা-বিচ্ছিন্ন নামের তালিকা (যেমন namedtupleআছে) সহ।


3
>> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v == my_var][0]
>> my_var_name 
'my_var'

স্থানীয় () - বর্তমান স্কোপের স্থানীয় ভেরিয়েবলগুলি সম্বলিত একটি অভিধান ফেরত দিন। এই অভিধানটির মাধ্যমে পুনরাবৃত্তি করে আমরা কীটি নির্ধারণ করতে পারি যার সংজ্ঞাযুক্ত ভেরিয়েবলের সমান মান রয়েছে, কেবল কীটি বের করা আমাদের স্ট্রিং ফর্ম্যাটে ভেরিয়েবলের পাঠ্য দেবে।

থেকে (একটি বিট পরিবর্তন পরে) https://www.tutorialspoint.com/How-to-get-a-variable-name-as-a-string-in-Python


2

আমি মনে করি যে পাইথনে এটি করা এত কঠিন কারণ আপনি যে ভেরিয়েবলটি ব্যবহার করছেন তার নাম আপনি কখনই জানতে পারবেন না। সুতরাং, তার উদাহরণে, আপনি এটি করতে পারেন:

পরিবর্তে:

list_of_dicts = [n_jobs, users, queues, priorities]

dict_of_dicts = {"n_jobs" : n_jobs, "users" : users, "queues" : queues, "priorities" : priorities}

2

ইনপুট ভেরিয়েবলের সামগ্রীর উপর ভিত্তি করে এটি করার আরও একটি উপায়:

(এটি ইনপুট ভেরিয়েবলের সাথে মেলে এমন প্রথম ভেরিয়েবলের নাম ফেরত দেয়, অন্যথায় কোনও কিছুই নেই input ইনপুট ভেরিয়েবলের মতো একই বিষয়বস্তুযুক্ত সমস্ত ভেরিয়েবলের নাম পেতে যে কেউ এটি পরিবর্তন করতে পারে)

def retrieve_name(x, Vars=vars()):
    for k in Vars:
        if type(x) == type(Vars[k]):
            if x is Vars[k]:
                return k
    return None

2

এই ফাংশনটি এর মান সহ ভেরিয়েবলের নাম মুদ্রণ করবে:

import inspect

def print_this(var):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()
    print(str([k for k, v in callers_local_vars if v is var][0])+': '+str(var))
***Input & Function call:***
my_var = 10

print_this(my_var)

***Output**:*
my_var: 10

2

আমার একটি পদ্ধতি আছে, এবং সবচেয়ে দক্ষ না হওয়ার পরে ... এটি কার্যকর হয় ! (এবং এটি কোনও অভিনব মডিউল জড়িত না)।

মূলত এটি আপনার তুলনা চলক এর আইডি থেকে globals () ভেরিয়েবল 'ID- র , তারপর ম্যাচের নাম ফেরৎ।

def getVariableName(variable, globalVariables=globals().copy()):
    """ Get Variable Name as String by comparing its ID to globals() Variables' IDs

        args:
            variable(var): Variable to find name for (Obviously this variable has to exist)

        kwargs:
            globalVariables(dict): Copy of the globals() dict (Adding to Kwargs allows this function to work properly when imported from another .py)
    """
    for globalVariable in globalVariables:
        if id(variable) == id(globalVariables[globalVariable]): # If our Variable's ID matches this Global Variable's ID...
            return globalVariable # Return its name from the Globals() dict

1

যদি লক্ষ্যটি আপনাকে আপনার ভেরিয়েবলগুলি ট্র্যাক রাখতে সহায়তা করে, আপনি একটি সাধারণ ফাংশন লিখতে পারেন যা ভেরিয়েবলটিকে লেবেল করে এবং এর মান এবং প্রকারটি প্রদান করে। উদাহরণস্বরূপ, ধরুন i_f = 3.01 এবং আপনি কোনও কোড ব্যবহার করতে i_n নামক একটি পূর্ণসংখ্যার সাথে গোল করে, এবং তারপরে একটি স্ট্রিং আই_এস দরকার যা একটি প্রতিবেদনে যাবে।

def whatis(string, x):
    print(string+' value=',repr(x),type(x))
    return string+' value='+repr(x)+repr(type(x))
i_f=3.01
i_n=int(i_f)
i_s=str(i_n)
i_l=[i_f, i_n, i_s]
i_u=(i_f, i_n, i_s)

## make report that identifies all types
report='\n'+20*'#'+'\nThis is the report:\n'
report+= whatis('i_f ',i_f)+'\n'
report+=whatis('i_n ',i_n)+'\n'
report+=whatis('i_s ',i_s)+'\n'
report+=whatis('i_l ',i_l)+'\n'
report+=whatis('i_u ',i_u)+'\n'
print(report)

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

আমি একজন পাইথন নবাগত এবং আমি প্রোগ্রামটি চালানোর সময় এবং আমার পাইথনের সমস্ত বস্তুর সাথে লড়াই করার চেষ্টা করার জন্য আমার প্রচেষ্টাগুলি লগ করার জন্য খুব দরকারী উপায়টি পেয়েছি। একটি ত্রুটি হ'ল হোয়াটিস () ব্যর্থ হয় যদি এটি ব্যবহার করা হয় এমন পদ্ধতির বাইরে বর্ণিত কোনও ফাংশনকে কল করে। উদাহরণস্বরূপ, INT (i_f) একটি বৈধ ফাংশন কল শুধুমাত্র কারণ ছিল int- এ ফাংশন পাইথন জন্য পরিচিত। আপনি ইনট (আই_ফ ** ২) ব্যবহার করে হোয়াটিসকে কল করতে পারেন, তবে কোনও অদ্ভুত কারণে যদি আপনি ইনট_সোয়ার্ড নামে একটি ফাংশন সংজ্ঞায়িত করতে চান তবে এটি অবশ্যই প্রক্রিয়াটির ভিতরে ঘোষণা করতে হবে যেখানে হোয়াটস () ব্যবহৃত হয়।


1

হতে পারে এটি কার্যকর হতে পারে:

def Retriever(bar):
    return (list(globals().keys()))[list(map(lambda x: id(x), list(globals().values()))).index(id(bar))]

ফাংশনটি বিশ্বব্যাপী সুযোগ থেকে মানগুলির আইডির তালিকার মধ্য দিয়ে যায় (নাম স্থানটি সম্পাদনা করা যেতে পারে), তার আইডির ভিত্তিতে পছন্দসই / প্রয়োজনীয় বর্ণের সূচক বা ফাংশনটি সন্ধান করে এবং তারপরে বৈশ্বিক নামের তালিকা থেকে নামটি ফিরিয়ে দেয় অধিগ্রহণ সূচক।


1

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

class CustomDict(dict):
    def __add__(self, other):
        return CustomDict({**self, **other})

class GlobalBase(type):
    def __getattr__(cls, key):
        return CustomDict({key: globals()[key]})

    def __getitem__(cls, keys):
        return CustomDict({key: globals()[key] for key in keys})

class G(metaclass=GlobalBase):
    pass

x, y, z = 0, 1, 2

print('method 1:', G['x', 'y', 'z']) # Outcome: method 1: {'x': 0, 'y': 1, 'z': 2}
print('method 2:', G.x + G.y + G.z) # Outcome: method 2: {'x': 0, 'y': 1, 'z': 2}

A = [0, 1]
B = [1, 2]
pd.DataFrame(G.A + G.B) # It will return a data frame with A and B columns

0

ধ্রুবকগুলির জন্য, আপনি একটি এনাম ব্যবহার করতে পারেন, যা এর নাম পুনরুদ্ধার করতে সহায়তা করে।


0

আমি পরিদর্শনকারী স্থানীয়দের কাছ থেকে নাম নেওয়ার চেষ্টা করি, তবে এটি কোনও [1], বি। এটির পরে, আমি একটি নতুন ধারণা পেয়েছি --- কোড থেকে বর্ণের নাম পান, এবং আমি এটি চেষ্টা করে! নীচের মত কোড:

#direct get from called function code
def retrieve_name_ex(var):
    stacks = inspect.stack()
    try:
        func = stacks[0].function
        code = stacks[1].code_context[0]
        s = code.index(func)
        s = code.index("(", s + len(func)) + 1
        e = code.index(")", s)
        return code[s:e].strip()
    except:
        return ""

0

আপনি যে ফাংশনটি সংজ্ঞায়িত করেছেন তার নাম পুনরুদ্ধার করতে আপনি নিম্নলিখিতটি চেষ্টা করতে পারেন (যদিও বিল্ট-ইন ফাংশনগুলির জন্য কাজ করে না):

import re
def retrieve_name(func):
    return re.match("<function\s+(\w+)\s+at.*", str(func)).group(1)

def foo(x):
    return x**2

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