Передать экземпляр как аргумент функции - PullRequest
2 голосов
/ 14 августа 2010

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

Раньше у меня было Class в libtweather.py. Это был мой account. Это позволило мне сделать accountName.parseFeed(), и я получил бы в качестве результата анализируемой погоды Yahoo. (__ini__ взяли в качестве аргумента URL погоды, имя пользователя и пароль Twitter)

Это было доступно из моего основного скрипта, который создал экземпляры Class, например:
exec '%s = lw.twitterWeather("%s", "%s", "%s")' % (item[0], item[1], item[2], item[3]) В нем содержался список всех имен учетных записей в списке, который передавался в качестве аргумента другим функциям.

Другая функция getWeather получает погоду, выполняя:

def getWeather(accountList): #account names passed as a list of strings
    for item in accountList:
        print item, ': ',
        item = eval(item)       
        print item.parseFeed(), '\n

Теперь я решил переместить функцию getWeather в тот же файл, что и Class, но строка item = eval(item) вызывает у меня проблемы, поскольку в этом файле не создано ни одного экземпляра. Все они в основном скрипте.

Теперь мой вопрос: могу ли я как-то передать эти экземпляры в качестве аргументов функции? Или я должен поместить функцию в Class? Даже если бы я это сделал, мне все равно нужно было бы сделать item.parseFeed() для нескольких элементов в списке, поэтому мне все равно понадобится item = eval(item), нет?

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

Обновление: В итоге я запустил libtweather.py, чтобы создать экземпляры при его импорте, чтобы функции, находящиеся в нем, могли получить к ним доступ (добавил код, генерирующий экземпляр, в нижней части скрипта). Я уверен, что есть лучший способ, но он работает для меня в настоящее время, и я в порядке с этим.

1 Ответ

5 голосов
/ 15 августа 2010

Вы должны использовать явный дикт для хранения этих предметов. eval, exec, globals, locals и vars - все это ужасно глупые способы сделать это плохо. Помните из дзен Python: «явное лучше, чем неявное».

feeds = {}
for item in whatever:
    feeds[item[0]] = lw.twitterWeather(*item[1:])

def getWeather(feeds, accountList):
    for item in accountList:
        print '%s: %s' % (item, feeds[item].parseFeed())
...