2010-06-11 6 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो एक टुपल देता है, जिसमें दूसरों के बीच एक फ्लोट वैल्यू होता है। आमतौर पर मैं उन लोगों की तुलना करने के लिए assertAlmostEquals का उपयोग करता हूं, लेकिन यह tuples के साथ काम नहीं करता है। इसके अलावा, टुपल में अन्य डेटा-प्रकार भी होते हैं। वर्तमान में मैं व्यक्तिगत रूप से ट्यूपल के हर तत्व पर जोर दे रहा हूं, लेकिन इस तरह के tuples की सूची के लिए यह बहुत अधिक हो जाता है। क्या ऐसे मामलों के लिए दावे लिखने का कोई अच्छा तरीका है? इस समारोह पर विचार करें:फ्लोट्स के साथ tuples के लिए टेस्ट दावे

def f(a): 
    return [(1.0/x, x * 2) for x in a] 

अब मैं इसके लिए एक परीक्षण लिखना चाहते हैं:

def testF(self): 
    self.assertEqual(f(range(1,3)), [(1.0, 2), (0.5, 4)]) 

यह असफल हो जायेगी क्योंकि 1.0/2 का नतीजा बिल्कुल 0.5 नहीं है। क्या कोई ऐसे पठनीय तरीके से इस तरह के दावे को लिखने का एक अच्छा तरीका सुझा सकता है?

संपादित करें: दरअसल 1.0/2 बिल्कुल 0.5 है, लेकिन आपको मेरा अर्थ मिलता है।

+0

असल में 0.5 'डबल' के लिए बिल्कुल प्रतिनिधित्व योग्य है। – kennytm

+0

बस यह भी पता चला कि - लेकिन आपको सामान्य बिंदु मिलती है। –

उत्तर

7

खैर कैसे ज़िप की जोड़ी के साथ अपने समारोह अप रोगी के बारे में:

def testF(self): 
    for tuple1, tuple2 in zip(f(range(1,3)), [(1.0, 2), (0.5, 4)]): 
     for val1, val2 in zip(tuple1, tuple2): 
      if type(val2) is float: 
       self.assertAlmostEquals(val1, val2, 5) 
      else: 
       self.assertEquals(val1, val2) 

मेरे यहाँ आधार यह है कि है एक लूप में एकाधिक आवेषणों का उपयोग करने के लिए बेहतर है क्योंकि यह सटीक मान प्राप्त करता है जहां यह टूट जाता है, बनाम सभी के साथ एकल assert का उपयोग कर बनाम()।

ps। यदि आपके पास अन्य संख्यात्मक प्रकार हैं, तो आप assertAlmostEquals का उपयोग करना चाहते हैं, तो आप ऊपर दिए गए उदाहरण को बदल सकते हैं। if type(val2) in [float, decimal.Decimal]:

2

मैंने जो किया है वह एक कस्टम-फ़ंक्शन लिखना है जो एक जटिल डेटा प्रकार के लिए वैधता स्थापित करता है, और फिर assert(IsFooValid(foo)) का उपयोग करता है। वैधता फ़ंक्शन केवल सही/गलत लौटा सकता है, लेकिन उचित संदेश के साथ AssertionError को बढ़ाने के लिए आमतौर पर बेहतर होता है।

3

मैं शायद एक रिकर्सिव फ़ंक्शन को परिभाषित करूंगा।

from collections import Iterable; 

def recursiveAssertAlmostEqual(testCase, first, second, *args, **kwargs): 
    if isinstance(first, Iterable) and isinstance(second, Iterable): 
     for a, b in zip(first, second): 
     recursiveAssertAlmostEqual(testCase, a, b, *args, **kwargs) 
    else: 
     testCase.assertAlmostEqual(first, second, *args, **kwargs) 

(ध्यान दें कि यह (1, 2) और [1, 2] बराबर हैं पर जोर होगा।)

संबंधित मुद्दे