2017-09-04 62 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上,所以我修改了。 –

相关问题