2014-06-27 4 views
1

Это, вероятно, очень важный вопрос, но у меня есть вопрос об атрибутах. У меня есть модуль, отвечающий за действия API Документов Google, который содержит функции для извлечения информации. Я хотел бы иметь возможность ссылаться на определенные переменные из этих функций в качестве атрибутов. Вот пример:Назначить атрибут функции

Gdocs.py

def getRows(): 
    rows = #action for getting rows 
    rowsText = #action for converting to text 

General.py

import Gdocs 
text = Gdocs.getRows.rowstext 

Я знаю, что основной эффект передачи переменных может быть достигнуто только возвращение значения, но я бы как бы ссылаться на них как на атрибуты, если это возможно. Проще говоря, мой вопрос в том, как вы можете создать атрибут функции, которую я могу ссылаться в другом документе .py?

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

+1

Атрибуты * *, что именно? –

+4

Возможно, вам нужен класс, а не только функция, если у вас есть как атрибуты, так и методы. – jonrsharpe

+0

@Martijn Pieters: Я хотел создать атрибут функции gerRows выше – tudorleriu

ответ

0

Это звучит так, как будто вы хотите, чтобы вернуть результат, состоящий из нескольких частей. Не используйте для этого атрибуты функции, возвращайте объект new, который можно адресовать с помощью атрибутов. Это также сделает его потокобезопасным, так как функциональные атрибуты живут в той же области, что и сам объект функции: как глобальный.

Стандартная библиотека имеет полезную функцию класса фабрики как раз для таких возвращаемых значений, collections.namedtuple():

from collections import namedtuple 

Point = namedtuple('Point', 'x y') 

def calculate_coordinates(foo, bar, baz): 
    return Point(42, 81) 

Возвращаемое значение представляет собой кортеж подклассу, поэтому он может рассматриваться как кортеж (с индексацией), его могут быть распакованы в отдельные ценности, или вы можете использовать атрибуты:

result = calculate_coordinates(spam, ham, eggs) 
print result.x, result.y 

или

res_x, res_y = calculate_coordinates(spam, ham, eggs) 

все произведение.

+0

Спасибо ... Простите за это... – MLSC

0

Хотя я понимаю, что вы сказали о том, не желая класс для каждой функции ...

Когда у вас есть класс, вы можете применить @property декоратор к функциям. Это позволяет эффективно создавать функции, демонстрирующие поведение, но их можно вызывать как атрибуты. В следующем случае, если вы хотите создать список квадратов на основе списка входных данных, вы можете создать функцию с глагольным именем, называемым create_list_of_squares(). Но в этом случае, если вы действительно хотите, чтобы API был прост и абстрагирован от механики за методом и просто позволял пользователям получать доступ к квадратам атрибутов, вы можете использовать декоратор свойств, например этот ...

class SquareList(list): 
    @property 
    def squares(self): 
     return [x ** 2 for x in self] 

s = SquareList([1, 2, 3, 4]) 
print s.squares 

который даст:

[1, 4, 9, 16] 
0

Это немного странно, но вы можете использовать staticmethod и классы, чтобы получить то, что вы хотите. Ключ:

источник: zattr2.ру

class getRows(object): 
    @staticmethod 
    def rows(arg): 
     return [arg, arg] 

    @staticmethod 
    def rowsText(arg): 
     return repr(arg) 

использование:

>>> import zattr2 
>>> zattr2.getRows.rowsText('beer') 
"'beer'" 

См: https://docs.python.org/2/library/functions.html#staticmethod

Смежные вопросы