क्यों खाली मानों की सूची खाली नहीं माना जाता है के बारे में अपने पहले सवाल का जवाब करने के लिए, क्योंकि यह कुछ शामिल करता है, भले ही उन चीजों के लिए खुद को खाली हैं बस। इसके बारे में खाली बक्से के एक बॉक्स की तरह सोचो।
नीचे दिया गया कोड जो आप चाहते हैं उसे करने के लिए फंक्शन foo()
को संशोधित करने का एक तरीका दिखाता है (और इसका परीक्षण करें)। खाली सूची क्या है, इसकी आपकी धारणा आश्चर्यजनक रूप से तैयार करने के लिए मुश्किल थी, आंशिक रूप से क्योंकि यह भाषा को खाली मानती है।जैसा कि आप अपनी परिभाषा के अनुसार सूची "रिक्त" है, यह निर्धारित करने के साथ निपटने वाले सभी तर्कों को देख सकते हैं कि empty_list()
नामक एक अलग फ़ंक्शन में स्थानांतरित हो गया है, क्योंकि शायद foo()
के बाकी हिस्सों के साथ बहुत कुछ नहीं करना है। यह अत्यधिक जटिल नहीं है और यदि कुछ और आपको एक अच्छा प्रारंभिक बिंदु प्रदान नहीं करना चाहिए।
इसके अलावा, आपने यह नहीं कहा कि यह क्या करना चाहिए यदि यह पारित किया गया तर्क किसी भी प्रकार की सूची नहीं है या सूची थी, लेकिन इसमें केवल अन्य सूचियां या तार नहीं थे, इसलिए लिखा गया है कि यह एक उठाएगा TypeError
अपवाद - कुछ ऐसा जो कि अधिकांश अंतर्निहित पायथन कार्यों के समान होता है जब यह उनके साथ होता है।
try:
string_type = basestring
except NameError: # probably Python 3.x
string_type = str
class _NULL(object): # unique marker object
def __repr__(self): return '<nothing>'
_NULL = _NULL()
def empty_list(arg=_NULL):
arg = arg if arg is not _NULL else []
if not isinstance(arg, (list, string_type)):
raise TypeError
elif isinstance(arg, string_type):
return not len(arg)
else:
return len(arg) == 0 or all(empty_list(e) for e in arg)
def foo(list_=None):
if list_ is None or empty_list(list_):
print 'list is empty'
else:
print 'list is not empty'
testcases = [
_NULL,
[],
[''],
['', ''],
['', ['']],
['abc'],
['', 'abc'],
[False],
[None],
[0],
[0.0],
[0L],
[0j],
[42],
[{}],
[{'':0}],
[{'a':1}],
False,
None,
0,
0.0,
0L,
0j,
42,
{},
{'':0},
{'a':1},
]
for arg in testcases:
call = 'foo({!r:s}) ->'.format(arg)
print '{!s:>20s}'.format(call),
try:
foo() if arg is _NULL else foo(arg)
except TypeError:
print 'illegal argument exception'
यहाँ उत्पादन यह अजगर 2.7 के साथ पैदा करता है: नीचे नमूना कोड और इसके परीक्षण उत्पादन है
foo(<nothing>) -> list is empty
foo([]) -> list is empty
foo(['']) -> list is empty
foo(['', '']) -> list is empty
foo(['', ['']]) -> list is empty
foo(['abc']) -> list is not empty
foo(['', 'abc']) -> list is not empty
foo([False]) -> illegal argument exception
foo([None]) -> illegal argument exception
foo([0]) -> illegal argument exception
foo([0.0]) -> illegal argument exception
foo([0L]) -> illegal argument exception
foo([0j]) -> illegal argument exception
foo([42]) -> illegal argument exception
foo([{}]) -> illegal argument exception
foo([{'': 0}]) -> illegal argument exception
foo([{'a': 1}]) -> illegal argument exception
foo(False) -> illegal argument exception
foo(None) -> list is empty
foo(0) -> illegal argument exception
foo(0.0) -> illegal argument exception
foo(0L) -> illegal argument exception
foo(0j) -> illegal argument exception
foo(42) -> illegal argument exception
foo({}) -> illegal argument exception
foo({'': 0}) -> illegal argument exception
foo({'a': 1}) -> illegal argument exception
नोट- मैं के मामले में समझ में एक्स = [ ''] सूची सही मायने में नहीं है खाली लेकिन फिर भी आप जानते हैं कि यह खाली है :) (या इसमें मूल्य/डेटा नहीं है जिसका उपयोग किया जा सकता है) –
आप ** वास्तव में ** क्या करने की कोशिश कर रहे हैं? आप ** ** ['', '' '] को "खाली" क्यों मानना चाहते हैं? –
['', ''] बड़ी समस्या नहीं है .... इस सेट के लिए (['', '']) का उपयोग किया जा सकता है !! –