當我使用Python中的三引號多行字符串,我傾向於使用textwrap.dedent保持代碼的可讀性,具有良好的縮進:使用Python中與字節textwrap.dedent()3
some_string = textwrap.dedent("""
First line
Second line
...
""").strip()
但是,在Python 3.x中,textwrap.dedent似乎不適用於字節字符串。我遇到過這種一邊寫單元測試爲返回長的多字節字符串,例如一個方法:
# The function to be tested
def some_function():
return b'Lorem ipsum dolor sit amet\n consectetuer adipiscing elit'
# Unit test
import unittest
import textwrap
class SomeTest(unittest.TestCase):
def test_some_function(self):
self.assertEqual(some_function(), textwrap.dedent(b"""
Lorem ipsum dolor sit amet
consectetuer adipiscing elit
""").strip())
if __name__ == '__main__':
unittest.main()
在Python 2.7.10上面的代碼工作正常,但在Python 3.4.3失敗:
E
======================================================================
ERROR: test_some_function (__main__.SomeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 16, in test_some_function
""").strip())
File "/usr/lib64/python3.4/textwrap.py", line 416, in dedent
text = _whitespace_only_re.sub('', text)
TypeError: can't use a string pattern on a bytes-like object
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
因此:是否有替代textwrap.dedent與字節字符串?
- 我可以自己編寫這樣一個函數,但是如果有一個現有函數,我寧願使用它。
- 我可以轉換爲unicode,使用textwrap.dedent,並轉換回字節。但是,如果字節字符串符合一些Unicode編碼,這是唯一可行的。
使用hex.b以外的好主意。我已經在我的項目中使用了六個,所以使用six.b不會增加額外的依賴。我的編碼擔憂並不是關於源文件中的非ASCII字符,而是像「\ xff」這樣的十六進制轉義序列。不過,我現在已經測試,它適用於所有這些序列(six.b(S)上的Python 3等同於s.encode(「拉丁-1」))。我會接受這個答案。 – nomadictype