2016-09-06 5 views
2

У нас есть приложение .NET, которые могут быть настроены по IronPython (версия 2.7.5)Python возвращает строку одновременно Обл и Юникода типа

Вот код сценария:

stringToPlay = # get it from our .NET app interface toward python here. The method returns .NET string 

Log.Write("isinstance(stringToPlay, unicode): ", str(isinstance(stringToPlay, unicode))) 

Log.Write("isinstance(stringToPlay, str): ", str(isinstance(stringToPlay, str))) 

Обе строки логов вернется Истина ??

stringToPlay value is "Ћирилица".

Как это возможно, когда str и unicode должны быть двумя отдельными классами, наследующими от basestring?

Спасибо

+0

Каков результат 'type (stringToPlay)'? ваша '.NET string' -' System.String'? –

ответ

4

В IronPython, тип str и unicode типа являются тем же объектом. Строковый тип .NET - это unicode.

6

IronPython не имеет значения между str и unicode, что может быть очень запутанным, если вы привыкли к семантике CPython 2. Фактически, basestring и unicode оба являются псевдонимами для str.

IronPython 2.7.4 (2.7.0.40) on .NET 4.0.30319.42000 (32-bit) 
Type "help", "copyright", "credits" or "license" for more information. 
>>> unicode 
<type 'str'> 
>>> basestring 
<type 'str'> 

Что касается строк, IronPython (2.X) ведет себя больше как Python 3, с немного раздражает то, что вы не можете отличить unicode и str, если вы хотите декодировать/кодировать в зависимости от типа (и поскольку он все еще Python 2, также нет bytes).

+0

есть ли какие-либо проблемы с Unify и IronPython, как это имеет место у CPython 2. * или только в той детали, которую вы указали? –

+0

Вы имеете в виду Unicode, а не Unify, не так ли? «Проблема» с Python 2 и Unicode состоит в том, что сначала изначально были только закодированные байтовые строки (ASCII, Latin1, UTF-8 или что-то еще). Введение типа 'unicode' (для представления независящих от кодирования строк) приводит к путанице, потому что теперь у вас есть два типа строк со сложными отношениями. Особенно вызов 'encode' /' decode', независимо от типа, является проблематичным (например, кодирование уже кодированной строки, декодирование строк unicode и т. Д.) –

+0

Правило большого пальца: обрабатывайте все строки, такие как строки Unicode в IronPython. Никогда не вызывайте 'decode' или' encode' на строку, если вы не делаете IO. Тогда у вас не должно быть проблем. (Это на самом деле имитирует стиль обработки строк Python 3). –