Canonical / Idiomatic «делай, что я имею в виду», когда передал строку, которая может содержать имя файла, URL или фактические данные для работы - PullRequest
2 голосов
/ 10 мая 2009

Нередко встречаются библиотеки Python, которые предоставляют универсальную функцию «opener», которая принимает в качестве основного аргумента строку, которая может представлять локальное имя файла (которое он будет открывать и обрабатывать), URL (который он будет загрузить и обработать) или данные (с которыми он будет работать).

Вот пример из Feedparser .

Мой вопрос: есть ли стандартный "правильный" способ сделать это? Или модуль, который реализует эту функциональность (возможно, в качестве декоратора)?

1 Ответ

7 голосов
/ 10 мая 2009

В конечном счете, любой модуль, реализующий это поведение, собирается проанализировать строку. И действовать в соответствии с результатом. Например, в feedparser они разбирают URL:

if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'):
    # do something with the url
else:
    # This is a file path
    return open(url_file_stream_or_string)

Вот хороший декоратор, который сделает это за вас:

import urlparse, urllib

def opener(fun):
    def wrapper(url):
        if urlparse.urlparse(url)[0] in ('http', 'https', 'ftp'):
            return fun(urllib.urlopen(url))
        return fun(open(url))
    return wrapper

@opener
def read(stream):
   return stream.read()

read('myfile')
read('http://www.wikipedia.org')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...