функция для загрузки как строк, так и файлов на диск? - PullRequest
1 голос
/ 16 октября 2011

У меня есть вопрос дизайна. У меня есть функция loadImage () для загрузки файла изображения. Теперь он принимает строку, которая является путем к файлу. Но я также хочу иметь возможность загружать файлы, которые не находятся на физическом диске, например. генерируется процедурно. Я мог бы принять строку, но как узнать, что это не путь к файлу, а данные файла? Я мог бы добавить дополнительный логический аргумент, чтобы указать это, но это звучит не очень чисто. Есть идеи? Сейчас это примерно так:

def loadImage(filepath):
    file = open(filepath, 'rb')
    data = file.read()
    # do stuff with data

Другая версия будет

def loadImage(data):
    # do stuff with data

Как заставить эту функцию принимать и filepath или data и угадывать, что это такое?

Ответы [ 3 ]

3 голосов
/ 16 октября 2011

Вы можете изменить функцию loadImage, чтобы она открывала объект, похожий на файл, например:

def load_image(f):
    data = file.read()

... а затем вызывается из двух функций, одна из которых ожидает путь, а другая - строка, содержащая данные:

from StringIO import StringIO

def load_image_from_path(path):
    with open(path, 'rb') as f:
        load_image(f)

def load_image_from_string(s):
    sio = StringIO(s)
    try:
        load_image(sio)
    finally:
        sio.close()
0 голосов
/ 16 октября 2011

Будучи Python, вы можете легко различать имя файла и строку данных. Я бы сделал что-то вроде этого:

import os.path as P
from StringIO import StringIO
def load_image(im):
    fin = None
    if P.isfile(im):
        fin = open(im, 'rb')
    else:
        fin = StringIO(im)

    # Read from fin like you would from any open file object

Другими способами сделать это будет блок try вместо использования os.path, но суть подхода остается прежней.

0 голосов
/ 16 октября 2011

Как насчет создания двух функций, loadImageFromString и loadImageFromFile?

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