2016-09-16 7 views
7

Например, в C# (начиная с v6) можно сказать:Есть ли эквивалент Python для C#?. а также ?? операторы?

mass = (vehicle?.Mass/10) ?? 150; 

установить массу до одной десятой массы транспортного средства, если есть транспортное средство, но 150, если транспортное средство является нулевым (или имеет null mass, если свойство Mass имеет тип NULL).

Есть ли эквивалентная конструкция в Python (в частности, IronPython), которую я могу использовать в сценариях для моего приложения C#?

Это было бы особенно полезно для отображения значений по умолчанию для значений, которые могут быть изменены другими значениями - например, у меня может быть компонент брони, определенный в сценарии для моего звездолета, который всегда потребляет 10% пространства, доступного на корабле он установлен, а другие его атрибуты также масштабируются, но я хочу отображать значения по умолчанию для размера брони, hitpoints, cost и т. д., чтобы вы могли сравнить его с другими компонентами корабля. В противном случае мне, возможно, придется написать свернутое выражение, которое выполняет нулевую проверку или два, как я должен был на C# перед v6.

+0

Вы будете использовать тройной оператор на месте из них –

+2

Важно помнить, что вы не должны пытаться сделать один язык соответствующим вашим идеологиям, которые вы получили от другого. У Python есть собственный способ делать такие вещи. Я предлагаю искать однострочные выражения 'if/else'. –

+0

@ PM2Ring: код C# тоже не является. –

ответ

11

Нет, Python еще не имеет NULL-коалесцирующих операторов.

Существует предложение (PEP 505 – None-aware operators) добавить такие операторы, но не существует единого мнения кастрированный баран или не они должны быть добавлены к языку вообще и если да, то в какой форме они будут принимать.

Из реализации раздела:

Учитывая, что потребность в None -aware операторов сомнительна и написание указанных операторов почти зажигательно, деталь реализации для CPython будет отложена до тех пор пока мы имеют более четкое представление о том, что один (или более) из предлагаемых операторов будет одобрен.

Обратите внимание, что Python действительно не имеют концепцию null. Имена и атрибуты Python всегда ссылка что-то, они никогда не являются ссылкой null. None - это еще один объект в Python, и сообщество неохотно делает этот объект настолько особенным, что ему нужны его собственные операторы.

До тех пор это не получает реализовано (если когда-либо, и IronPython догоняет эту версию Python), вы можете использовать в Python conditional expression для достижения того же:

mass = 150 if vehicle is None or vehicle.Mass is None else vehicle.Mass/10 
+0

Да, я думал о чем-то подобном; просто надеялся, что будет более сжатый путь! Интересно, что вызывает споры о «написании» операторов? – ekolis

+1

@ekolis: самая противоречивая часть - более или менее, чтобы поднять «Нет» до уровня, где он получает выделенных операторов.Затем возникают вопросы синтаксического анализа и приоритета, чтобы рассмотреть, где эти операторы будут действительно сталкиваться с остальной частью языка. –

+0

Я думал, что могу написать функцию, похожую на функцию «если» в Excel, но я не думаю, что мог бы написать ее, как будто нет (vehicle, vehicle.Mass, 150), потому что сначала нужно оценить автомобиль. что приведет к разыменованию транспортного средства, даже если оно отсутствует, не так ли? Я полагаю, что я мог бы пройти в лямбда, но это было бы почти так же сложно, как и предложение if, которое вы предложили ... – ekolis