Остановить оценку в модуле - PullRequest
10 голосов
/ 02 июля 2010

Я привык писать функции, которые работают следующим образом:

def f():
  if sunny:
    return
  #do non-sunny stuff

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

if sunny:
  import tshirt
  #do something here to skip the rest of the file
import raincoat
import umbrella
#continue defining the module for non-sunny conditions

Я знаю, что могу написать это как if/else, но кажется глупым делать отступ для всего остального моего модуля.

Я мог бы двигатьсяостальной код в отдельный модуль и условно импортировать его, но это кажется болезненным.

Ответы [ 6 ]

2 голосов
/ 02 июля 2010

Отдельные файлы и дополнительные отступы, вероятно, разумны, если учесть, что это странная вещь для начала.

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

def foo(): 
  print "foo"
def bar(): 
  print "bar"

if sunny:
  del foo
else:
  del bar
1 голос
/ 17 мая 2014

Просто в той же ситуации, и я не хотел делать отступ в целом коде в моем модуле. Я использовал исключения, чтобы остановить загрузку модуля, поймал и проигнорировал пользовательское исключение. Это делает мой модуль Python очень процедурным (что, я полагаю, не идеально), но в нем сохранены некоторые значительные изменения кода.

У меня был общий / вспомогательный модуль, в котором я определил следующее:

import importlib

def loadModule(module):
    try:
        importlib.import_module(module)
    except AbortModuleLoadException:
        pass;

class AbortModuleLoadException(Exception):
    pass;

При этом, если бы я хотел «отменить» или «остановить» загрузку модуля, я бы загрузил модуль следующим образом:

loadModule('my_module');

И внутри моего модуля я могу выдать следующее исключение для определенного условия:

if <condition>:
    raise AbortModuleLoadException;
0 голосов
/ 02 июля 2010

Вы можете использовать функцию, чтобы сделать это:

def foo():
    if True:
        import re
        import os
    else:
        import sys
    return locals()

locals().update(foo())

или

def foo():
    if not True:
        import sys
        return locals()
    import re
    import os

    return locals()

locals().update(foo())
0 голосов
/ 02 июля 2010

Я бы серьезно отнесся к этому решению:

if sunny:
    print "it's sunny"
else:
    exec '''
print "one"
print "two"
x = 3
print x
# ETC
'''

Серьезно, нет.Но это работает.

0 голосов
/ 02 июля 2010

Вам нужно будет сделать отступ в вашем коде, так или иначе.Самый простой способ - определить код внутри функций и вызвать их.Это обеспечивает чистоту блоков if/else.

def do_if_sunny():
    pass

def do_if_rainy():
    pass

if sunny:
    do_if_sunny()
else:
    do_if_rainy()

Кроме того, вы всегда можете использовать sys.exit.

if sunny:
    print "It's sunny"
    sys.exit(0)

# Continue with non-sunny conditions
0 голосов
/ 02 июля 2010

Отступ условной части мне кажется нормальным.Если это действительно долго - скажем больше, чем один или два экрана, я бы, вероятно, переместил условные части в отдельные файлы.Ваш код будет намного легче читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...