Самый правильный способ определения функции с вариациями для платформ - PullRequest
0 голосов
/ 08 апреля 2019

Сегодня я наткнулся на этот ответ , который определяет функцию после определения системной платформы.

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

import subprocess
import sys

def show_file(path):
    if sys.platform == "darwin":
        subprocess.check_call(["open", "--", path])
    elif sys.platform == "linux":
        subprocess.check_call(["xdg-open", "--", path])
    elif sys.platform == "win32":
        subprocess.check_call(["explorer", "/select", path])

Мне любопытно, эффективнее ли это сделать так @ Dietrich Epp имеет?

if sys.platform == "darwin":
    def show_file(path):
        subprocess.check_call(["open", "--", path])
elif sys.platform == "linux":
    def show_file(path):
        subprocess.check_call(["xdg-open", "--", path])
elif sys.platform == "win32":
    def show_file(path):
        subprocess.check_call(["explorer", "/select", path])

Я понятия не имею, работает ли какой-либо из приведенных выше фрагментов, но это на самом деле не является частью вопроса.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Одним из следствий помещения определения функции show_file() в условное выражение является то, что попытка использовать эту функцию на неподдерживаемой платформе вызовет NameError.Помещение условных выражений в функцию show_file приведет к ее тихому сбою, если только вы не включите raise в последний блок else.

На ваше усмотрение, что лучше.Лично я предпочел бы явную ошибку на неподдерживаемой платформе, но я думаю, для ясности, это, вероятно, лучше всего обрабатывать как окончательное else условие, поэтому причина исключения очень ясна.

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

2 голосов
/ 08 апреля 2019

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

0 голосов
/ 08 апреля 2019

«Лучший способ», вероятно, зависит от ваших приоритетов.

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

import subprocess
import sys


class UnsupportedPlatformException(Exception):
    pass


def _show_file_darwin():
    subprocess.check_call(["open", "--", path])

def _show_file_linux():
    subprocess.check_call(["xdg-open", "--", path])

def _show_file_win32():
    subprocess.check_call(["explorer", "/select", path])

_show_file_func = {'darwin': _show_file_darwin, 
                   'linux': _show_file_linux,
                   'win32': _show_file_win32}

try:
    show_file = _show_file_func[sys.platform]
except KeyError:
    raise UnsupportedPlatformException


# then call show_file() as usual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...