Различение между возвратами пользовательских функций и возвратами классов - PullRequest
0 голосов
/ 03 марта 2012

У меня проблемы с разработкой стандарта для возврата данных из пользовательских функций, переданных и выполненных в классе, который выполняет функцию как отдельный поток.

Цель состоит в том, чтобы передать аргументы возврата из функции по запросу пользователя.

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

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

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

пример:

вызов пользователя

def foo():
    #...do lots of stuff that takes long time

    # return whether stuff worked or not (None if worked False if not)
    return success 

takes_forever = detach(foo)

# ... do other things

# get data from detached function which has hopefully completed
are_you_done = takes_forever.give_me_data()

Мой класс:

class detach:
    def __init__(self, func):
        self.detached_func = execute_as_thread(func)

    def give_me_data(self) 
        if self.detached_func.is_done():        # function completed and didnt die
            return [self.detached_func.output]
        else:                                   # something went wrong or function is still running
            return None

Ответы [ 2 ]

1 голос
/ 03 марта 2012

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

class NoResultsType(object): pass

NoResults = NoResultsType()

def give_me_data(self) 
    if self.detached_func.is_done():        # function completed and didnt die
        return [self.detached_func.output]
    else:                                   # something went wrong or function is still running
        return NoResults

и затем вы можете определить несколько таких типов, например, NoResults, FunctionFailed и т. Д., И пользователь может просто проверить их, например,

ret = foo.give_me_data()
if ret in [NoResultsYet, FunctionFailed]:
   # do something

или вы можете вернуть объект Result, который может сохранить исходный результат, состояния и т. Д.

class Result(object):
    def __init__(self):
         self.finished = False
         self.success = False
         self.error = ""
         self.result = None

res = foo.give_me_data()
if res.success:
    print res.result
0 голосов
/ 03 марта 2012

Вы можете использовать два метода в своем классе отсоединения:

is_finished () Сообщает, выполняется ли еще вызов функции.

get_data () Получит вам возвращаемые значения вашего detached_func. Если функция еще не завершена, она блокируется до завершения функции.

Я не знаю каких-либо стандартов Python, но вы можете посмотреть на класс Future Java, который упаковывает результат задачи, которая выполняется асинхронно. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html

...