2017-09-04 120 views
1

我試圖單元測試一個python函數,但它似乎不能代替函數內部的任何字符。即使該功能應該工作?替換字符串中的特殊字符

錯誤消息:

E  AssertionError: assert 'TE/ST-' == 'AEOEAA_TE_ST_' 
E   - æøå TE/ST- 
E   + AEOEAA_TE_ST_ 

功能

class Formatter(object): 

    @classmethod 
    def string(self, string): 

     new_string = string.upper() 


     # split cases 
     new_string.replace(' ', '_') 
     new_string.replace('-', '_') 
     new_string.replace('/', '_') 

     # chars 
     new_string.replace('Ø', 'OE') 
     new_string.replace('Å', 'AA') 
     new_string.replace('Æ', 'AE') 

     return new_string 

測試

def test_formatter(): 
    test = Formatter.string('æøå te/st-') 
    assert test.decode('utf-8') == 'AEOEAA_TE_ST_' 
+0

在Python 2中,請務必正確標記您的unicode字符串:'u'Ø''。 –

回答

4

str.replace不是就地功能,這意味着當你調用它,它返回一個值,您必須指定回原始變量,否則將不會看到更改。作爲一個例子,考慮:

In [315]: string = 'æøå te/st-'.upper() 

現在,撥打.replace

In [316]: string.replace('Ø', 'OE') 
Out[316]: 'ÆOEÅ TE/ST-' 

In [317]: string 
Out[317]: 'ÆØÅ TE/ST-' 

沒有變化。現在試着分配回:

In [318]: string = string.replace('Ø', 'OE') 

In [319]: string 
Out[319]: 'ÆOEÅ TE/ST-' 

作爲一個更快的替代方案,可以考慮使用str.translate。如果您使用的是python3,則可以傳遞替換字典映射(您無法在python2上執行此操作)。

class Formatter(object):  
    @classmethod 
    def string(self, strn): 
     tab = dict.fromkeys(' -/', '_') 
     tab.update({'Ø' : 'OE', 'Å' : 'AA', 'Æ' : 'AE'}) 

     return strn.upper().translate(str.maketrans(tab)) 

對於python2,你可以選擇堅持str.replace

+1

不錯,剛發現'str.translate',謝謝! – Netwave

+0

AttributeError:'str'對象沒有屬性'maketrans' –

+0

@PeterPik是的,我意識到你在python2上,所以我修改了。 –