কোনও ভেরিয়েবলের উপস্থিতি আছে কিনা তা আমি কীভাবে পরীক্ষা করব?


953

আমি ভেরিয়েবলের উপস্থিতি আছে কিনা তা পরীক্ষা করতে চাই। এখন আমি এই জাতীয় কিছু করছি:

try:
   myVar
except NameError:
   # Do something.

ব্যতিক্রম ছাড়া অন্য উপায় আছে?


15
ব্যতিক্রম কি ভুল?
এস .লট

10
@ এস.লোট: যদি myVarসত্যিই জটিল কিছু হয়, যা উত্পাদন / মূল্যায়ন করতে অনেক সময় নেয়, tryধীর জিনিসগুলি কী কমবে না ?
dbliss

3
@ ডিবি্লিস: এটি একটি পরিবর্তনশীল। কিছু সত্যই অদ্ভুত ঘটনা বাদ দিয়ে যদি আপনি পাগল execবা মেটাক্লাসগুলি দিয়ে কিছু করছেন তবে এটি ব্যয়বহুল হবে না।
ব্যবহারকারী 2357112

আরো একটি সম্পূর্ণ উত্তর: stackoverflow.com/a/1592578/1661797
nickboldt

উত্তর:


1625

স্থানীয় ভেরিয়েবলের অস্তিত্ব পরীক্ষা করতে:

if 'myVar' in locals():
  # myVar exists.

গ্লোবাল ভেরিয়েবলের অস্তিত্ব পরীক্ষা করতে:

if 'myVar' in globals():
  # myVar exists.

কোনও বস্তুর কোনও বৈশিষ্ট্য রয়েছে কিনা তা পরীক্ষা করতে:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.

29
ঠিক আছে, এবং আমি ক্লাসে বিদ্যমান বৈশিষ্ট্য কীভাবে পরীক্ষা করতে পারি?
ম্যাক্স ফ্রেই

7
এবং আপনি কীভাবে এমন পরিবর্তনশীলটির নাম পরিবর্তন করবেন যা সম্ভবত কোনও স্ট্রিংয়ে বিদ্যমান নেই?
সাইলেন্টগোস্ট

15
কিন্তু ওপি কোডটি টাইপ করছে, তারা মাইভারের 'মাইভার' অন্তর্নিহিত টাইপ করতে পারে। কোডটি লেখার সময় যদি ভেরিয়েবলের নামটি না জানা থাকে, তবে এটি রানটাইমের সময় একটি স্ট্রিং ভেরিয়েবলে সংরক্ষণ করা হবে এবং আমি পোস্ট করা চেকটিও কাজ করবে।
আয়মান হৌরিহ

8
এছাড়াও বিল্ট-ইন ভেরিয়েবলগুলি রয়েছে এবং যদি আপনার নেস্টেড ফাংশন থাকে তবে বাইরের স্কোপে ভেরিয়েবল। আপনি যদি তাদের সবার জন্য যাচাই করতে চান তবে আপনি সম্ভবত NameErrorসর্বোপরি ট্রিগারটি বন্ধ করে দেবেন ।
পেটর ভিক্টরিন

14
আমি if hasattr(obj, 'attr_name'):ক্লাসগুলির জন্যও কাজ করে যা সবচেয়ে ভাল পছন্দ করে: যেমনif hasattr(self, 'attr_name'):
রন কালিয়ান

118

ব্যবহারের ভেরিয়েবল আছে এখনো সংজ্ঞায়িত বা সেট (পরোক্ষভাবে বা স্পষ্টভাবে) হয়েছে করা প্রায় সবসময় একটি খারাপ জিনিস কোন , ভাষা যেহেতু এটি প্রায়ই ইঙ্গিত করে যে প্রোগ্রামের যুক্তিবিজ্ঞান সঠিকভাবে মাধ্যমে চিন্তা করা হয়েছে, এবং এর ফলে সম্ভবত অপ্রত্যাশিত আচরণে।

যদি আপনাকে পাইথনে এটি করার দরকার হয়, নীচের কৌশলটি যা আপনার অনুরূপ, এটি নিশ্চিত করবে যে কোনও ভেরিয়েবলের ব্যবহারের আগে কিছু মান আছে :

try:
    myVar
except NameError:
    myVar = None

# Now you're free to use myVar without Python complaining.

তবে, আমি এখনও নিশ্চিত নই যে এটি একটি ভাল ধারণা - আমার মতে, আপনার কোডটি রিফ্যাক্টর করার চেষ্টা করা উচিত যাতে এই পরিস্থিতিটি না ঘটে।


8
হতে পারে এটি নির্ভরশীলতার একটি পরিবর্তনশীল, এবং সংস্করণ / প্ল্যাটফর্মের সাথে মিল রেখে এটি উপস্থিত থাকতে পারে বা নাও থাকতে পারে এবং এটি কী সংস্করণ তা জানার উপায় নেই।
নটহাগো

35
রাষ্ট্রের ভেরিয়েবলগুলি নির্ধারিত হওয়ার আগে উপস্থিত নেই - আপনি যদি পূর্ববর্তী অবস্থান থেকে বর্তমান অবস্থানে একটি লাইন আঁকেন, তবে পূর্ববর্তী = বর্তমান সেট করুন, এর অর্থ এই নয় যে আপনি প্রথম কলটিতে "আপনার ভেরিয়েবলগুলি জানেন না"। এবং অঙ্কন রুটিনের বাইরে পূর্ববর্তী = নাল শুরু করার জন্য কোডের একটি অতিরিক্ত লাইন লেখার অর্থ এই নয় যে আপনি "আপনার ভেরিয়েবলগুলি জানেন" আরও ভাল।
ডেভ

4
আমার বক্তব্যটি হ'ল একটি ব্লক "যদি শেষ: আঁকুন (শেষ, বর্তমান); শেষ = বর্তমান" বোঝা সহজ এবং খারাপ প্রোগ্রামিং নয়। "শেষ" এর অস্তিত্ব পরীক্ষা করার জন্য "কোড / পাঠানো" যুক্ত করা কোডটির পাঠযোগ্যতা থেকে বিরত থাকে।
ডেভ

23
"ভেরিয়েবলগুলির ব্যবহার যা সংজ্ঞায়িত করা হয় নি আসলে কোনও ভাষায় খারাপ জিনিস" আমাকে কমনীয় বক্তৃতাটি বাঁচান। আমাদের মধ্যে কিছু সাধারণ গণিত বা স্পাইডারের মতো আইডিই ব্যবহার করে ম্যাথল্যাবের মতো পরিসংখ্যান স্ক্রিপ্টগুলির জন্য পাইথন ব্যবহার করে। এই পরিবেশগুলিতে কখনও কখনও ব্যবহারকারীকে গ্লোবাল কনসোলে ভেরিয়েবলগুলি সংজ্ঞায়িত করার অনুমতি দেয় এবং মতলবতে গণিত করার সময় স্ক্রিপ্টে অঘোষিত হয় কিনা তা অন্যথায় পরীক্ষা করে তোলে It
রিকার্ডো ক্রুজ ২

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

52

একটি সহজ উপায় প্রথম বক্তব্য এ এটি আরম্ভ করা হয় myVar = None

তারপরে পরে:

if myVar is not None:
    # Do something

2
এই উত্তরে আরও অনেক কিছু উন্নত করতে হবে। বরং - একটি সহজ উপায় হ'ল প্রথমে এটি ঘোষণা করা। myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
শন মেহান

আমি এটিকে অনেক পছন্দ করি কারণ আমি আমার exceptবিবৃতিতে
কারও

কেন এমন কিছু নয়: if myVar: # Do something এটি ডাবল নেতিবাচক পড়ার প্রয়োজনীয়তা
এড়ায়

@ জিজিস্নো কারণ আপনি myVarখালি তালিকা, শূন্য, খালি স্ট্রিং ইত্যাদি হলেও এই শর্তটি সত্য হতে চান
গ্যাব্রিয়েল

7
@ জিজিসনউ অজগর 3 if myVar: # Do somethingছুড়ে NameErrorমারে যদি আমারভিয়ার ঘোষণা না করা হয়
বিন বিন

25

কোনও চলকের অস্তিত্বের জন্য পরীক্ষা করা / চেষ্টা করা ব্যতীত সর্বোত্তম উপায়। তবে বিশ্বব্যাপী ভেরিয়েবলগুলি নির্ধারণ / পরীক্ষার চেয়ে আপনি যা যা করছেন তা করার অবশ্যই একটি ভাল উপায় আছে।

উদাহরণস্বরূপ, আপনি যখন প্রথম কোনও ফাংশনটি কল করার জন্য মডিউল-স্তরের ভেরিয়েবলটি শুরু করতে চান, আপনি কোডের মতো কিছু দিয়ে ভাল হন:

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...

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

17

বস্তু / মডিউলগুলির জন্য, আপনি এটিও করতে পারেন

'var' in dir(obj)

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

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False

11

আমি ধরে নেব যে পরীক্ষাটি ব্যবহারকারীর in73 , 70০ এর উত্তরের মতো কোনও ফাংশনে ব্যবহৃত হতে চলেছে । আমি উত্তরটি পছন্দ করি না কারণ এটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করে। এটির সমাধানের একটি উপায় পরিবর্তে একটি ক্লাস ব্যবহার করা:

class InitMyVariable(object):
  my_variable = None

def __call__(self):
  if self.my_variable is None:
   self.my_variable = ...

আমি এটি পছন্দ করি না, কারণ এটি কোডটিকে জটিল করে তোলে এবং যেমন প্রশ্নগুলি খোলায়, এটি কি সিঙ্গলটন প্রোগ্রামিং প্যাটার্নটির নিশ্চয়তা দেয়? ভাগ্যক্রমে, পাইথন ফাংশনগুলিকে কিছু সময়ের জন্য বৈশিষ্ট্য রাখার অনুমতি দিয়েছে, যা আমাদের এই সহজ সমাধান দেয়:

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None

9

catchexceptপাইথন বলা হয়। এ ছাড়া এ জাতীয় সাধারণ মামলার জন্য এটি ঠিক আছে। আছে AttributeErrorযে যদি একটি বস্তু একটি বৈশিষ্ট্য রয়েছে চেক করতে ব্যবহার করা যাবে।


5

এই ধরণের পরিস্থিতি পরিচালনার জন্য প্রায়শই ভালভাবে কাজ করার উপায়টি হল ভেরিয়েবলটি উপস্থিত রয়েছে কিনা তা স্পষ্টভাবে যাচাই না করে কেবল এগিয়ে যান এবং সম্ভবত অস্তিত্বশীল ভেরিয়েবলের প্রথম ব্যবহারটি নেপথেকে চেষ্টা করে / মোড়ানো:

# Search for entry.
for x in y:
  if x == 3:
    found = x

# Work with found entry.
try:
  print('Found: {0}'.format(found))
except NameError:
  print('Not found')
else:
  # Handle rest of Found case here
  ...

3

আমি একটি কাস্টম ফাংশন তৈরি করেছি।

def exists(var):
     var_exists = var in locals() or var in globals()
     return var_exists

তারপরে কলটি ফাংশনটির মতো অনুসরণ variable_nameকরে আপনি যে ভেরিয়েবলটি পরীক্ষা করতে চান তা প্রতিস্থাপন করুন :

exists("variable_name")

ফিরে আসবে TrueবাFalse


2
না, এটি কাজ করবে না। locals()হচ্ছে ... মাত্রই ভুল করে ... ফাংশন স্থানীয় exists😅
bgusach

1
1) স্থানীয় () ফাংশন স্থানীয়। 2) কেন var_exists অতিরিক্ত অ্যাসাইনমেন্ট?
ডেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.