LINUX.ORG.RU

Python — 2 вопроса


0

0

Буквально на днях начал учить Python, сейчас пишу простую программу для бэкапа (форк из книги A Byte of Python :) ). Есть два вопроса:

1. Стилистический: двойные и одинарные кавычки -- что когда использовать? Чисто семантически они идентичны, хотя вот я заглянул в чужой код, там используется и те и другие, логику проследить не смог.

2. Конкретная ситуация: в главный исполняемый файл подключается модуль, в котором содержатся функции вывода красивых print'ов. В главном же файле парсится argv (достаточно примитивно, через if-elif). Если передается флаг -d, хотелось бы, что бы показывались 'debug' сообщения -- т.е. нужно каким-то образом сообщить подключаемому модулю, что был передан этот флаг. Пробовал вариант с global переменной -- не сработало. Как это можно сделать?

Наверное, можно в самом модуле объявить переменную, вроде 'if_debug' и индивидуально устанавливать ее в True во время парсинга argv, но мне хотелось бы более общего решения -- чтобы все (потенциальные) подключаемые модули знали о состоянии программы относительно debug-сообщений.

anonymous

1. пользуйся тем, что больше нравится (обычно это двойные кавычки :))

2. без текста проги на такие вопросы не ответишь. но глобальные переменные - зло 8)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

1. По мне лучше одинарные -- для двойных надо в 2 раза больше кнопок давить :)

2. Вроде того

[backup.py]

import msg
import sys

if_verbose = False

#...

for arg in sys.argv:
    if arg == "-v":
        if_verbose = True
    elif arg == "-h":
        usage()
        sys.exit()
    #...

vmsg("Current settings are:", "i")
#...



[msg.py]

def msg(msg, type=""):
    if type == "i":
        msg = "  | " + msg
    #...

    print msg

def vmsg(msg, type=""):
    if if_verbose == True:
        msg(msg, type)

anonymous
()
Ответ на: комментарий от anonymous

ну так где импорт?

from backup import if_verbose

Ну и вообще - тебя, ИМХО, понесло не в ту сторону... сила Питона - в его stdlib. Там есть отличные классы для разбора опций :)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

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

Не флейма ради: код на питоне выглядит "незаконченным", curly braces наше все =)

anonymous
()
Ответ на: комментарий от tailgunner

Ок.

Долгое время просто кодил исключительно на баше -- видимо накладывает отпечаток. В баше же scope of vision у переменных по умолчанию глобальный, плюс простота source...

anonymous
()

import logging ? Он вроде прекрасно для журналирования подходит =)

sanwashere ★★
()
Ответ на: комментарий от anonymous

2. Сделать класс с методами msg и vmsg. В инициализаторе передавать ему аргумент verbose.

По идеи, сам модуль ничего не должен знать о том, как он используется. Т.е. ничего видеть из основного файла не должен.

Davidov ★★★★
()
Ответ на: комментарий от Davidov

> import logging ? Он вроде прекрасно для журналирования подходит =)

Спасибо за наводку, но пока слишком сложно.

> 2. Сделать класс с методами msg и vmsg. В инициализаторе передавать ему аргумент verbose.

> По идеи, сам модуль ничего не должен знать о том, как он используется. Т.е. ничего видеть из основного файла не должен.

О классах буду сейчас читать, наверное такое как раз и реализую.

Вообще, после шелла в питоне СТОЛЬКО нужно нового учить, я просто за голову хватаюсь :) Всю 'stdlib' реально если не выучить, то хотя бы примерно знать?

anonymous
()
Ответ на: комментарий от Davidov

А вот заодно и проблема, которую пока не удается решить:

Нужно проверить имеет ли процесс право записи в каталог. В help('os') нашел метод access(path, mode), где mode может быть или F_OK или R_OK или W_OK или X_OK. Делаю access(my_path, 'W_OK'), получаю TypeError: an integer is required. Куда рыть?

anonymous
()
Ответ на: комментарий от anonymous

Т.е., вообще, при чем тут интегер и куда он required?

anonymous
()
Ответ на: комментарий от anonymous

> Всю 'stdlib' реально если не выучить, то хотя бы примерно знать?

А зачем? Как по мне достаточно знать, в каком месте что лежит. Если нужно знать точнее -- открываешь справочник или юзаешь какие-то интерактивные методы поиска документации.

rab_boziy
()
Ответ на: комментарий от Davidov

> 2. Сделать класс с методами msg и vmsg. В инициализаторе передавать ему аргумент verbose.

ыыы... зочем класс?

def out_msg(verbose, msg): if verbose: print msg

vmsg = lambda msg: out_msg(True, msg)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> вообще тру-ооп, все дела

это не тру-ООП, это indian Java-way OOP.

tailgunner ★★★★★
()
Ответ на: комментарий от rab_boziy

> Совершенно верно. И это те же R_OK, W_OK и X_OK которые рассказаны в man 2 access :)

Да, почему я зацепился за эту аналогию -- сразу стало понятно, как в вместе указывать пермишены в числовом виде -- как в chmod, скажем, R_OK И X_OK: 4+1=5.

> Вообще, у меня в маковском мануале написано, что "Access() is a potential security hole and should never be used."

Маковод? :) Здесь тоже: http://docs.python.org/lib/os-file-dir.html, хотя другого способа я не нашел и вряд ли дело в реализации принципа, но, ИМХО, в самом принципе -- "почекал - совершил действие".

anonymous
()
Ответ на: комментарий от anonymous

> Маковод?

Ага, надоело с линуксами возиться... Хотя на серверах все равно от линукса не уйдешь.

А зачем проверять что-то аксессом? Может как-то красивее можно

rab_boziy
()

> Если передается флаг -d, хотелось бы, что бы показывались 'debug' сообщения
> т.е. нужно каким-то образом сообщить подключаемому модулю, что был передан
> этот флаг.

например так:

==config.py==
class config:
    debug = False

==main.py==

from config import config

def main(argv):
    if '-d' in argv: 
        config.debug = True

==pprint.py==

from config import config

def pprint(str):
     if config.debug:
           print "DEBUG", bla-bla-bla

anonymous
()

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

ero-sennin ★★
()
Ответ на: комментарий от rab_boziy

> А зачем проверять что-то аксессом? Может как-то красивее можно

Таки, наверное, можно, может даже через try..catch, но я его пока, как бы, не знаю :)

> например так:

Ok, смысл понятен

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

Да, спасибо, мне его уже второй раз советуют :) Посмотрю обязательно, как только опыта наберусь.

anonymous
()
Ответ на: комментарий от anonymous

>> Таки, наверное, можно, может даже через try..catch, но я его пока, как бы, не знаю :)

Только в питоне это называется try/except :)

cathode
()

На первый вопрос ты сам ответил.

Относителльно второго - предлагаю в каждом подключаемом модуле импортировать главный модуль: import __main__ if __main__.your_global_variable: print 'Debug mode on.'

anonymous
()
Ответ на: комментарий от anonymous

# Прошу прощения, предыдущий пост неверно отформатирован.
import __main__ 
if __main__.your_global_variable: 
  print 'Debug mode on.'

anonymous
()
Ответ на: комментарий от anonymous

Зачем всё это? На твои вопросы уже не раз ответили.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.