Надежно обнаружьте Windows в Python

Использование попытки:

if(NewType* v = dynamic_cast(old)) {
   // old was safely casted to NewType
   v->doSomething();
}

Это требует, чтобы Ваш компилятор, чтобы иметь поддержку rtti включил.

РЕДАКТИРОВАНИЕ: у меня были некоторые хорошие комментарии к этому ответу!

Каждый раз необходимо использовать dynamic_cast (или instanceof), необходимо спросить себя, является ли это необходимой вещью. Это обычно - знак плохого дизайна.

Типичные обходные решения помещают специальное поведение для класса, на который Вы проверяете в виртуальную функцию на базовом классе или возможно представляете что-то как посетитель , где можно представить определенное поведение для подклассов, не изменяя интерфейс (за исключением добавления приемного интерфейса посетителя, конечно).

, Как указано dynamic_cast не прибывает бесплатно. Простой и последовательно работающий взлом, который обрабатывает большинство (но не все случаи) в основном добавляет перечисление, представляющее все возможные типы, которые Ваш класс может иметь и проверить, получили ли Вы правильный.

if(old->getType() == BOX) {
   Box* box = static_cast(old);
   // Do something box specific
}

Это не хороший дизайн oo, но это может быть обходное решение, и его стоимость является более или менее только вызовом виртуальной функции. Это также работает независимо от RTTI, включен или нет.

Примечание, что этот подход не поддерживает несколько уровней наследования поэтому, если Вы не осторожны, Вы могли бы закончить кодом, бывшим похожим на это:

// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
   Box* box = static_cast(old);
   // Do something box specific
}

52
задан blokkie 20 November 2014 в 06:23
поделиться

4 ответа

>>> import platform
>>> platform.system()
'Windows'
74
ответ дан 7 November 2019 в 09:02
поделиться

В моем окне Windows platform.system () возвращает «Windows» .

Однако я не уверен, почему вы » буду беспокоиться. Если вы хотите ограничить платформу, на которой она работает технологически, я бы использовал белый список, а не черный.

На самом деле, я бы вообще не стал делать это технологически, поскольку, возможно, следующий выпуск Python может иметь Win32 / Win64 вместо Windows (для черного списка) и * nix вместо Linux (для белого списка).

Я советую просто указать, каковы требования, и, если пользователь решит проигнорировать это, это его проблема. Если они звонят и говорят, что получили сообщение об ошибке «Не удается найти FHS» и признают, что работают в Windows, мягко укажите им, что эта конфигурация не поддерживается.

Возможно, ваши клиенты достаточно умны, чтобы запустить FHS под Windows, чтобы ваш код работал. Они вряд ли оценят то, что они тогда сочли бы произвольным ограничением вашего программного обеспечения.

Это проблема, с которой разработчики программного обеспечения сталкиваются каждый день. Даже огромные организации не могут поддерживать каждую отдельную платформу и конфигурацию.

17
ответ дан 7 November 2019 в 09:02
поделиться

Попробуйте следующее:

import platform

if platform.system() == "Darwin":
    # Don't have Windows handy, but I'd expect "Win32" or "Windows" for it

Изменить: Только что вы видели, что вы пробовали platform.platform () ... platform.system () в этом случае будет работать лучше. Поверьте мне, используйте это. Темные углы лежат в обнаружении платформы.

distutils тоже сделает это, если вы попросите его вежливо.

Вы всегда можете сделать что-то плохое, например os.path.exists () на Файл Windows ... но платформа столь же надежна, как и в стандартной библиотеке Python.

Редактировать 2: Другой полезный ответчик указал на platform.system () точно соответствует "Windows" на его машине с Windows.

10
ответ дан 7 November 2019 в 09:02
поделиться

Из справки (платформа)

system()
    Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

    An empty string is returned if the value cannot be determined.
2
ответ дан 7 November 2019 в 09:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: