2017-05-07 39 views
4

這些是django.db.models.fields爲什麼在這種情況下使用str()?

__all__ = [str(x) for x in (
    'AutoField', 'BLANK_CHOICE_DASH', 'BigAutoField', 'BigIntegerField', 
    'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField', 
    'DateField', 'DateTimeField', 'DecimalField', 'DurationField', 
    'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField', 
    'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField', 
    'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField', 
    'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField', 
    'TimeField', 'URLField', 'UUIDField', 
)] 

的代碼,我認爲str(x) for x in (...)x for x in (...)是在這種情況下是相同的。 爲什麼使用str()?

回答

7

注意代碼頂部的from __future__ import unicode_literals。 現在每個字符串默認情況下都是一個unicode字符串(就像它已經在Python 3中一樣)。

>>> from __future__ import unicode_literals 
>>> s = 'test' 
>>> type(s) 
<type 'unicode'> 

爲了避免在註釋

# Avoid "TypeError: Item in ``from list'' not a string" -- unicode_literals 
# makes these strings unicode 

提到的所有TypeError在元組('AutoField', 'BLANK_CHOICE_DASH', ...) unicode的文字被轉換到Python 2字節串。

如果上面的import語句不存在,那麼列表理解完全沒有意義(在兩個版本的Python中)是對的。

相關問題