2016-09-01 8 views
0

У меня только что появился малиновый Pi, и я создаю для него приложение на основе Reddit API, используя библиотеку PRAW. Я выполнение моего питон файлов с помощью:Сохранение кода DRY при повторном обращении к конфигурации параметров командной строки

sudo python3 main.py 

Однако, я хотел бы передать аргументы в этот файл из командной строки (так что я могу запустить приложение молча, передав ей аргумент silent, например), и я знаю, что смогу сделать это с sys.argv[0], sys.argv[1], etc...

Моя проблема заключается в следующем: DRY - Не повторяйте себя - ссылаясь на конфигурацию, установленную этими параметрами.

Это часть моего кода:

def init(): 
if (len(sys.argv) >= 1): 
    global semisilent 
    global silent 
    for arg in sys.argv: 
     if arg == "semisilent": 
      semisilent = True 
     if arg == "silent": 
      silent = True 

print ("--------[ Reddipi v0.1 ]--------\n") 

if silent: 
    print (" ++Running in silent mode++ \n") 
elif semisilent: 
    print ("++Running in semi-silent mode++ \n") 
else: 
    print ("  Logging in to reddit  ") 
    print ("    ....    ") 
global r 
r = oauth.login() 

if not silent: 
    print ("  Login successful  \n") 

if not silent and not semisilent: 
    print ("  Connecting to database  ") 
    print ("    ....    ") 
db.init(tablename) 
if not silent: 
    print ("  Connection successful  \n") 

if not silent and not semisilent: 
    global sub_name 
    q_sub = input("  Use custom subreddit?  \n") 
    if (q_sub[0]=="y"): 
     q_sub = input("  Enter custom subreddit: \n") 
     if ((len(q_sub)==0) or (q_sub==" ")): 
      print (" No valid input. Using default \"" + sub_name + "\" \n") 
     else: 
      sub_name = q_sub 
      print ("\r Using subreddit \"" + sub_name + "\"\n") 
    else: 
     print ("  Using default \"" + sub_name + "\" \n") 

Я считаю себя сделать код очень трудно читать, постоянно помещая if not silent и такие, прежде чем другие части кода. Я также думал о том, что у меня несколько методов с теми же важными функциями, но с кодом, который был оставлен, если пользователь поставил silent или semisilent, но это приведет к ненужному дублированию кода.

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

Большое спасибо за помощь! - Jeroen

+1

Вы имеете в виду как «logging»? –

+0

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

ответ

1

Определите свой собственный метод «печати», который проверяет, установлена ​​ли какая-либо переменная (тихая), и затем пропускает ее печать, если это значение установлено. Таким образом, все ваши строки print ('value') превратятся в нечто вроде myprint ('value'). Мне лично нравится использовать имена функций verbose() и debug() и иметь два уровня журнала. В вашем случае, может быть, назовите их «silent()» и «semisilent()» или что-то еще.

+0

Spot-on re: отвечает на вопрос. (Я бы предпочел использовать [стандартный библиотечный 'журнал] (https://docs.python.org/2/library/logging.html) вместо того, чтобы кататься самостоятельно для конкретного случая ведения журнала, но для общего случая инкапсуляции повторяющейся логики это правильный подход). –

+1

Спасибо! Это именно то, что я искал. Не могу понять, почему я сам об этом не думал. Также спасибо @CharlesDuffy за добавление. Я буду смотреть в журнал на будущее, но сейчас это кажется прекрасным. –