විචල්‍යයක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද?


989

මට විචල්‍යයක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍යයි. දැන් මම මේ වගේ දෙයක් කරනවා:

try:
   myVar
except NameError:
   # Do something.

ව්යතිරේක නොමැතිව වෙනත් ක්රම තිබේද?


15
ව්යතිරේකයේ වරද කුමක්ද?
එස්.ලොට්

10
L එස්. ලොට්: myVarසැබවින්ම සංකීර්ණ දෙයක් නම්, එය නිෂ්පාදනය කිරීමට / ඇගයීමට බොහෝ කාලයක් ගත වේ නම්, tryදේවල් මන්දගාමී නොවේද?
dbliss

3
bdbliss: එය විචල්‍යයකි. සමහර අමුතු අවස්ථා හැරුණු විට ඔබ පිස්සු execහෝ මෙටාක්ලාස් සමඟ යමක් කරන්නේ නම් එය මිල අධික නොවනු ඇත.
user2357112 මොනිකා සඳහා සහය දක්වයි

වඩාත් සම්පූර්ණ පිළිතුර: stackoverflow.com/a/1592578/1661797
nickboldt

Answers:


1680

දේශීය විචල්‍යයක පැවැත්ම පරීක්ෂා කිරීම සඳහා:

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

ගෝලීය විචල්‍යයක පැවැත්ම පරීක්ෂා කිරීම සඳහා:

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

වස්තුවකට ලක්ෂණයක් තිබේදැයි පරීක්ෂා කිරීමට:

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

32
හරි, පංතියේ පවතින ගුණාංග පරීක්ෂා කරන්නේ කෙසේද?
මැක්ස් ෆ්‍රේ

8
සහ විචල්‍යයේ නම නූල් බවට හරවන්නේ කෙසේද?
සයිලන්ට් හොස්ට්

16
නමුත් OP කේතය ටයිප් කරයි, ඔවුන්ට myVar හි 'myVar' intstead ටයිප් කළ හැකිය. කේතය ලියන විට විචල්ය නාමය නොදන්නේ නම්, එය ධාවන වේලාවේදී නූල් විචල්යයක ගබඩා වනු ඇත, මා පළ කළ චෙක්පතද ක්රියා කරයි.
අයිමන් හූරි

8
බිල්ට් විචල්යයන් ද ඇත, තවද, ඔබට කැදැලි කාර්යයන් තිබේ නම්, පිටත විෂය පථවල විචල්යයන්. ඔබට ඒවා සියල්ලම පරික්ෂා කිරීමට අවශ්‍ය නම්, ඔබ NameErrorසියල්ලටම පසුව අවුලුවාලීම වඩාත් සුදුසුය .
පීටර් වික්ටෝරින්

16
if hasattr(obj, 'attr_name'):පංති සඳහාද වැඩ කරන හොඳම දේට මම කැමතියි : එනම්if hasattr(self, 'attr_name'):
රොන් කලියන්

122

මෙම භාවිතය අර්ථ හෝ කට්ටලයක් (නිසැකයෙන්ම ඒම හෝ) කර කර නැති විචල්යයන් සැමවිටම පාහේ නරක දෙයක් ඕනෑම එය බොහෝ විට මෙම වැඩසටහන තර්කනය නිසි සිතා කර නොමැති බව පෙන්නුම්, හා එහි ප්රතිඵලයක් විය හැකි නිසා, භාෂාව අනපේක්ෂිත හැසිරීම් වල.

ඔබට එය පයිතන් හි කිරීමට අවශ්‍ය නම් , පහත දැක්වෙන උපක්‍රමය ඔබට සමාන වන අතර භාවිතයට පෙර විචල්‍යයකට යම් අගයක් ඇති බව සහතික කරයි:

try:
    myVar
except NameError:
    myVar = None

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

කෙසේ වෙතත්, එය හොඳ අදහසක් බව මට තවමත් ඒත්තු ගොස් නැත - මගේ මතය අනුව, මෙම තත්වය ඇති නොවන පරිදි ඔබේ කේතය නැවත සකස් කිරීමට උත්සාහ කළ යුතුය.


8
සමහර විට එය පරායත්තතාවයේ විචල්‍යයක් විය හැකි අතර, එය අනුවාදයට / වේදිකාවට අනුයුක්ත කිරීම හෝ නොපවතින අතර එය කුමන අනුවාදය දැයි දැන ගැනීමට වෙනත් ක්‍රමයක් නොමැත.
WhyNotHugo

37
ඒවා පැවරීමට පෙර රාජ්‍ය විචල්‍යයන් නොපවතී - ඔබ පෙර ස්ථානයේ සිට වත්මන් ස්ථානයට රේඛාවක් අඳින්නේ නම්, පෙර = ධාරාව සකසන්න, එයින් අදහස් කරන්නේ ඔබ පළමු ඇමතුමේදී “ඔබේ විචල්‍යයන් නොදන්නා” බවයි. දිනුම් ඇදීමෙන් පිටත පෙර = ශුන්‍ය ආරම්භ කිරීම සඳහා අතිරේක කේත පේළියක් ලිවීමෙන් අදහස් කරන්නේ ඔබ "ඔබේ විචල්‍යයන් වඩා හොඳින් දන්නා" බවයි.
ඩේව්

5
මගේ අදහස නම් බ්ලොක් එකක් "අන්තිම නම්: අදින්න (අන්තිම, ධාරාව); අන්තිම = ධාරාව" තේරුම් ගැනීමට පහසු වන අතර දුර්වල වැඩසටහන්කරණය නොවේ. එය පරීක්ෂා කිරීමට පෙර "අන්තිම" පැවැත්ම පරීක්ෂා කිරීම සඳහා "උත්සාහ කරන්න / හැර" එකතු කිරීම එම කේතයේ කියවීමේ හැකියාව අඩු කරයි.
ඩේව්

25
"නිර්වචනය කර නොමැති විචල්‍යයන් භාවිතා කිරීම ඇත්ත වශයෙන්ම ඕනෑම භාෂාවක නරක දෙයකි" අවිනිශ්චිත කථාව මට ඉඩ දෙන්න. අපගෙන් සමහරු සරල ගණිතය හෝ සංඛ්‍යාන ස්ක්‍රිප්ට් සඳහා පයිතන් භාවිතා කරන්නේ මැට්ලැබ් වැනි ස්පයිඩර් වැනි IDE භාවිතා කරමිනි. සමහර විට එම පරිසරයන් තුළ පරිශීලකයාට ගෝලීය කොන්සෝලයේ විචල්‍යයන් නිර්වචනය කිරීමට ඉඩ දීම සහ මැට්ලැබ් හි ගණිතය කරන විටදී මෙන් ඒවා පිටපතෙහි ප්‍රකාශයට පත් නොවන්නේ දැයි පරීක්ෂා කිරීම අර්ථවත් කරයි.
රිකාඩෝ

16
ඒ වෙනුවට එය විසින් අවමන්කිරීමකින් උපකල්පනය වඩා @Ricardo, සමහර විට, ඔබ අවම වශයෙන් කිරීමට ඔබට අවශ්ය විය හැක සලකා එය අයෙකුගෙන් පමණක් හොඳ උපදෙස් බව, හැකියාව ඇත , වඩා දැනුවත් විය :-) නැත්නම් මම ගෝලීය, නිර්බාධිත භාවිතය එරෙහිව උපදෙස් නම් ඔබට එය එක හා සමානව අනුග්රහ සලකා බලන විචල්යයන්, ස්පැගටි කේතය, දෙවියන්ගේ වස්තූන්, පරීක්ෂා නොකළ කේත නිකුත් කිරීම හෝ COBOL හි මෙහෙයුම් පද්ධති ලිවීම? මගේ පිළිතුරෙහි සඳහන් වූයේ එය නරක අදහසක් යැයි මා සිතුවේ මන්ද යන්නයි (සහ OP එය අවශ්‍ය යැයි සිතුවේ මන්දැයි යන ප්‍රශ්නයේ කිසිවක් නොතිබුණි) නමුත් ඔවුන්ට එය කිරීමට අවශ්‍ය අවස්තාවේ මගක් තවමත් ලබා දී ඇත.
paxdiablo

58

සරල ක්‍රමයක් නම් මුලින් කියමින් එය ආරම්භ කිරීමයි myVar = None

පසුව:

if myVar is not None:
    # Do something

2
මෙම පිළිතුරෙහි වැඩිදියුණු කළ යුතු බොහෝ දේ ඇත. ඒ වෙනුවට - සරල ක්‍රමයක් නම් එය පළමුව ප්‍රකාශ කිරීමයි. myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
ෂෝන් මේහාන්

මම මේකට ගොඩක් කැමතියි මොකද මම මගේ exceptප්‍රකාශ වල කිසිම දෙයකට දේවල් සකසා නැති නිසා
HashRocketSyntax

ඇයි එවැනි දෙයක් නොකරන්නේ: if myVar: # Do something මෙය ද්විත්ව negative ණාත්මක කියවීමේ අවශ්‍යතාවය
මගහරියි

jjjisnow myVarහිස් ලැයිස්තුවක්, ශුන්‍යයක්, හිස් නූලක් වුවද මෙම තත්වය සත්‍ය වීමට ඔබට අවශ්‍ය නිසා
ගේබ්‍රියෙල්

7
myVar ප්‍රකාශයට පත් නොකළේ නම් jjjisnow python3 if myVar: # Do somethingවිසි කරයිNameError
Agile Bean

27

විචල්‍යයක පැවැත්ම පරීක්ෂා කිරීම සඳහා හොඳම ක්‍රමය උත්සාහය / හැර භාවිතා කිරීමයි. නමුත් ගෝලීය විචල්‍යයන් සැකසීමට / පරීක්ෂා කිරීමට වඩා ඔබ කරන ඕනෑම දෙයක් කිරීමට වඩා හොඳ ක්‍රමයක් තිබේ.

උදාහරණයක් ලෙස, ඔබට පළමු වරට මොඩියුල මට්ටමේ විචල්‍යයක් ආරම්භ කිරීමට අවශ්‍ය නම්, ඔබ යම් ශ්‍රිතයක් අමතන විට, ඔබට මෙවැනි කේතයක් ලබා ගැනීම වඩා හොඳය:

my_variable = None

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

2
මම මෙය භාවිතා නොකිරීමට උත්සාහ කරමි, මන්ද එය ගෝලීය නාම අවකාශය දූෂණය කරයි. මෙය වළක්වා ගත හැකි එක් ක්‍රමයක් නම්, ශ්‍රිතය පන්ති විචල්‍යයක් ලෙස my_variable සමඟ පන්තියක් බවට පත් කිරීම සහ පවතින ශ්‍රිතයේ ශරීරය ලෙස ඇමතුම නිර්වචනය කිරීමයි, නමුත් එය කේත කිරීමට වේදනාවක් වන අතර වෙනත් ප්‍රශ්න රාශියක් විවෘත කරයි. ක්‍රියාකාරී ගුණාංග භාවිතා කිරීමට මම කැමැත්තෙමි, පහත බලන්න.
samwyse

18

වස්තු / මොඩියුල සඳහා, ඔබට ද හැකිය

'var' in dir(obj)

උදාහරණයක් වශයෙන්,

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

11

පරිශීලක 97370 ගේ පිළිතුරට සමාන ශ්‍රිතයක් තුළ පරීක්ෂණය භාවිතා කිරීමට ඇතැයි මම සිතමි . මම එම පිළිතුරට කැමති නැත, මන්ද එය ගෝලීය නාම අවකාශය දූෂණය කරයි. එය නිවැරදි කිරීමට එක් ක්‍රමයක් නම් ඒ වෙනුවට පන්තියක් භාවිතා කිරීමයි:

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

10

catchexceptපයිතන් හි හැඳින්වේ . ඒ හැර එවැනි සරල අවස්ථා සඳහා එය හොඳයි. මෙම තියෙනවා AttributeErrorවස්තුවක් විශ්ලේෂණයක් ඇති නම්, පරීක්ෂා කිරීමට යොදා ගත හැකි බව.


6

මෙවැනි තත්වයක් හසුරුවා ගැනීම සඳහා බොහෝ විට හොඳින් ක්‍රියා කරන ක්‍රමයක් නම් විචල්‍යය පවතින්නේ දැයි පැහැදිලිව පරීක්ෂා නොකොට ඉදිරියට ගොස් නාම දෝෂය හැර / නොපවතින විචල්‍යයේ පළමු භාවිතය උත්සාහයෙන් / එතීම:

# 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
  ...

4

මම අභිරුචි ශ්‍රිතයක් නිර්මාණය කළෙමි.

def exists(var):
     return var in globals()

variable_nameඔබට පරීක්ෂා කිරීමට අවශ්‍ය විචල්‍යය වෙනුවට පහත දැක්වෙන ශ්‍රිතය අමතන්න :

exists("variable_name")

නැවත පැමිණේ TrueහෝFalse


0

කෙටි ප්‍රභේදය:

my_var = some_value if 'my_var' not in globals() else my_var:
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.