Как разбить выписку на несколько строк? - PullRequest
0 голосов
/ 07 июня 2018

Каким будет правильный Pythonic способ разбить первую строку нижеприведенного выражения (появиться на нескольких строках), чтобы оно было более читабельным:

if props.getProperty("app.auth.idp.strategy") == '' or props.getProperty("app.auth.idp.strategy") == 'saml/simpleSAMLphp' and PROXYING_MECHANISM == "ngrok":
    IDP_STRATEGY = "saml/simpleSAMLphp"
elif props.getProperty("app.auth.idp.strategy") == 'saml/gsuite':
    IDP_STRATEGY = "saml/gsuite"
elif props.getProperty("app.auth.idp.strategy") == 'saml/remote-simpleSAMLphp':
    IDP_STRATEGY = "saml/remote-simpleSAMLphp"
else:
     IDP_STRATEGY = "saml"

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Refactor

Я бы начал с того, что не буду звонить props.getProperty("app.auth.idp.strategy") повторно.Назовите его один раз, и у вас сразу будет меньше причин разбивать любые строки.

strategy = props.getProperty("app.auth.idp.strategy")
if not strategy or strategy == 'saml/simpleSAMLphp' and PROXYING_MECHANISM == "ngrok":
    IDP_STRATEGY = "saml/simpleSAMLphp"
elif strategy == 'saml/gsuite':
    IDP_STRATEGY = "saml/gsuite"
elif strategy == 'saml/remote-simpleSAMLphp':
    IDP_STRATEGY = "saml/remote-simpleSAMLphp"
else:
     IDP_STRATEGY = "saml"

Продолжение строки

Для первой длинной строки ваши варианты - это продолжение строки, либо явное:

if not strategy or \
   strategy == 'saml/simpleSAMLphp' and \
   PROXYING_MECHANISM == "ngrok":

или неявно, внутри скобок:

if (not strategy or
    strategy == 'saml/simpleSAMLphp' and
    PROXYING_MECHANISM == "ngrok"):

Использовать поиск, а не повторные сравнения

Четная лучше опциязаменить длинную строку сравнений поиском dict:

strategies = {
    "saml/gsuite": "saml/gsuite",
    "saml/remote-simpleSAMLphp": "saml/remote-simpleSAMLphp",
}
if PROXYING_MECHANISM == "ngrok":
    strategies['saml/simpleSAMLphp'] = 'saml/simpleSAMLphp'

IDP_STRATEGY = strategies.get(props.getProperty("app.auth.idp.strategy"), "saml")

И поскольку каждый ключ dict просто сопоставлен с самим собой, вы можете заменить , который , напростой set поиск.

strategies = {
    "saml/gsuite",
    "saml/remote-simpleSAMLphp",
}
if PROXYING_MECHANISM == "ngrok":
    strategies.add('saml/simpleSAMLphp')

IDP_STRATEGY = "saml"

strategy = props.getProperty("app.auth.idp.strategy")
if strategy in strategies:
    IDP_STRATEGY = strategy

Выберите, какой из двух последних вы найдете более читабельным.dict является более избыточным в своем определении, но допускает одно присвоение IDP_STRATEGY.

0 голосов
/ 07 июня 2018

Возможно, что-то вроде этого согласно PEP8

if props.getProperty("app.auth.idp.strategy") == '' \
        or props.getProperty("app.auth.idp.strategy") == 'saml/simpleSAMLphp' \
        and PROXYING_MECHANISM == "ngrok":
    IDP_STRATEGY = "saml/simpleSAMLphp"
elif props.getProperty("app.auth.idp.strategy") == 'saml/gsuite':
    IDP_STRATEGY = "saml/gsuite"
elif props.getProperty("app.auth.idp.strategy") == 'saml/remote-simpleSAMLphp':
    IDP_STRATEGY = "saml/remote-simpleSAMLphp"
else:
     IDP_STRATEGY = "saml"
0 голосов
/ 07 июня 2018

Вы можете либо явно разорвать его с помощью '\', либо разбить его, поместив условие в скобки

if (a
    ==b
    ==c):
0 голосов
/ 07 июня 2018
prop_var = props.getProperty("app.auth.idp.strategy")    
if prop_var == '' or prop_var == 'saml/simpleSAMLphp' and PROXYING_MECHANISM == "ngrok":
        IDP_STRATEGY = "saml/simpleSAMLphp"
    elif prop_var == 'saml/gsuite':
        IDP_STRATEGY = "saml/gsuite"
    elif prop_var == 'saml/remote-simpleSAMLphp':
        IDP_STRATEGY = "saml/remote-simpleSAMLphp"
    else:
         IDP_STRATEGY = "saml"

Вы добавляете \ в конце каждой строки, как указано в комментарии.Вы также можете заменить каждый getProperty("app.auth.idp.strategy") на переменную, чтобы она вызывалась один раз.

...