Питон полноценный обработчик изображения


Это вид в рамках спокойного модуль обработчика изображения, написано на колбе, я уверен, что есть лучше/более подходящие для Python способ сделать части этого, возможно, используя списочные включения или функции генератора. Но я немного в Python Новичок и не заметит. Может любой опытный pythonistas взглянуть?

@__mod__.route('/', methods=['GET'])
@__mod__.route('/<filename>', methods=['GET'])
def get(filename=None):
    """ Get a list of all Images or a single Image """

    couchdb.init_app(current_app)
    image = Image()

    if filename is None:
        results = image.view('images/all')
        filenames = []
        for result in results.all():

            if result._attachments:
                for attachment in result._attachments.keys():
                    filenames.append(url_for('.get', filename=attachment))
        response = make_response(simplejson.dumps(filenames), 200)
        response.headers['Content-Type'] = 'application/json'
        return response
    else:
        results = image.view('images/all', key=filename)

        if results.first() is not None: 
            try:
                image_file = image.get_db().fetch_attachment(results.first(), filename)
                image_doc = results.first()._attachments[filename]
                response = make_response(image_file, 200)
                response.headers['Content-Type'] = image_doc['content_type']
                return response
            except ResourceNotFound:
                abort(404)

        else:
            abort(404)

Мне удалось это на мою собственную, с помощью понимания списка, а не уродливо-если структуры:

if filename is None:
    results = image.view('images/all')          
    filenames = [url_for('.get', filename=attachment) 
                 for result in results 
                 if result._attachments
                 for attachment in result._attachments]
    response = make_response(simplejson.dumps(filenames), 200)
    response.headers['Content-Type'] = 'application/json'
    return response
else:
    results = image.view('images/all', key=filename)

    if results.first(): 
        try:
            image_file = image.get_db().fetch_attachment(results.first(), filename)
            image_doc = results.first()._attachments[filename]
            response = make_response(image_file, 200)
            response.headers['Content-Type'] = image_doc['content_type']
            return response
        except ResourceNotFound:
            abort(404)
    else:
        abort(404)


2104
3
задан 22 декабря 2011 в 01:12 Источник Поделиться
Комментарии
1 ответ

@__mod__.route('/', methods=['GET'])
@__mod__.route('/<filename>', methods=['GET'])

Видя, как вы в конечном итоге эти две стороны совершенно по-разному, почему бы вам просто не реализовать две функции?

def get(filename=None):
""" Get a list of all Images or a single Image """

couchdb.init_app(current_app)
image = Image()

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

    if filename is None:
results = image.view('images/all')
filenames = []
for result in results.all():

if result._attachments:

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

                for attachment in result._attachments.keys():

Если вы проверяете выше пустой _attachments (в отличие от Нет), вам не надо. Этот цикл будет выполняться ноль раз по пустой словарь. Кроме того, вам не нужны ключи (), потому что итерации по умолчанию для справочника-это ключи

                    filenames.append(url_for('.get', filename=attachment))

Ты после редактирования с comprehensionified версия.

filenames = [url_for('.get', filename=attachment) 
for result in results
if result._attachments
for attachment in result._attachments]

Здесь существуют те же проблемы, как с явной для петли. Его немного длинные и сложные, что я мог бы сделать следующее

attachments = [result._attachments for result in results if result._attachments]
attachments = [attachment for attachment for attachments in attachments]
attachments = [url_for('.get', filename = attachment) for attachment in attachments]

Лучше? может быть. может и нет.

        response = make_response(simplejson.dumps(filenames), 200)
response.headers['Content-Type'] = 'application/json'
return response
else:
results = image.view('images/all', key=filename)

if results.first() is not None:
try:
image_file = image.get_db().fetch_attachment(results.first(), filename)
image_doc = results.first()._attachments[filename]
response = make_response(image_file, 200)
response.headers['Content-Type'] = image_doc['content_type']
return response

Я считаю служебная функция, которая вызывает make_response и устанавливает content_type.

            except ResourceNotFound:
abort(404)

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

        else:
abort(404)

1
ответ дан 22 декабря 2011 в 05:12 Источник Поделиться