Диаграмма может помочь:
[/g0]
Если это не было очевидно: синий = внешний div, красный = внутренний div; Я рисовал их с постоянной высотой и горизонтальным позиционированием. Вы можете решить, что произойдет, если высота будет соответствовать содержимому и т. Д.
В столбце «Перед свертыванием» показано, что вы получаете, если поля не считаются смежными, например. если вы нарисуете границу синего / внешнего div; но если границы нет, то вы получите столбец «После свертывания». Верхняя строка переключает два поля вокруг примера, потому что я считаю, что поведение в этом случае более интуитивное; нижний показывает пример в howtocreate и соответствует верхней строке.
На языках как Python я обычно использовал бы словарь, поскольку он включает меньше служебное, чем создание нового класса.
Однако, если я возвращаю постоянно тот же набор переменных, тогда это, вероятно, включает новый класс, который я факторизую.
+1 на предложении S.Lott именованного контейнерного класса.
Для Python 2.6 и, названный кортежем обеспечивает полезный способ легкого создания этих контейнерных классов, и результаты являются "легким весом и не требуют больше памяти, чем регулярные кортежи".
Обычно "специализированная структура" на самом деле ЯВЛЯЕТСЯ разумным текущим состоянием объекта с его собственными методами.
class Some3SpaceThing(object):
def __init__(self,x):
self.g(x)
def g(self,x):
self.y0 = x + 1
self.y1 = x * 3
self.y2 = y0 ** y3
r = Some3SpaceThing( x )
r.y0
r.y1
r.y2
мне нравится находить названия анонимных структур, если это возможно. Понятные имена делают вещи более ясными.
Я предпочитаю использовать кортежи каждый раз, когда кортеж чувствует себя "естественным"; координаты являются типичным примером, где отдельные объекты могут стоять самостоятельно, например, только в масштабирующихся вычислениях с одной осью, и порядок важен.Примечание: если я могу отсортировать или переставить объекты без отрицательного воздействия к значению группы, то я, вероятно, не должен использовать кортеж.
я использую словари в качестве возвращаемого значения только, когда сгруппированные объекты являются не всегда тем же. Думайте дополнительные почтовые заголовки.
Для остальной части случаев, где сгруппированные объекты имеют свойственное значение в группе или абсолютном объекте с его собственными методами, необходим, я использую класс.
Я голосую за словарь.
я нахожу что, если я делаю функцию, которая возвращает что-либо больше чем 2-3 переменные, я сложу их в словаре. Иначе я склонен забывать порядок и содержание того, что я возвращаю.
кроме того, представляя 'специальную' структуру делает Ваш код более трудным следовать. (Кто-то еще должен будет перерыть код для обнаружения то, что это)
, Если соответствующие о типе ищут, используйте описательные ключи словаря, например, 'x-значения перечисляют'.
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return {'y0':y0, 'y1':y1 ,'y2':y2 }
Для маленьких проектов я нахожу самым легким работать с кортежами. Когда это становится слишком твердым для управления (и не прежде) я начинаю группировать вещи в логические структуры, однако я думаю, что предложенное использование словарей и объектов ReturnValue является неправильным (или слишком упрощенным).
Возврат словаря с ключами y0, y1, y2, и т.д. не предлагает преимущества перед кортежами. При возврате экземпляра ReturnValue со свойствами .y0, .y1, .y2, и т.д. не предлагает преимущества перед кортежами также. Необходимо начать называть вещи, если Вы хотите добраться где-нибудь, и можно сделать то использование кортежи так или иначе:
def getImageData(filename):
[snip]
return size, (format, version, compression), (width,height)
size, type, dimensions = getImageData(x)
, по моему скромному мнению, единственная хорошая техника вне кортежей должна возвратить реальные объекты с правильными методами, и свойства, как Вы добираются от re.match()
или open(file)
.
Я предпочитаю:
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return {'y0':y0, 'y1':y1 ,'y2':y2 }
кажется, что все остальное - просто дополнительный код, чтобы сделать то же самое.
Именованные кортежи были добавлены в 2,6 с этой целью. Также см. os.stat для подобного встроенного примера.
>>> import collections
>>> Point = collections.namedtuple('Point', ['x', 'y'])
>>> p = Point(1, y=2)
>>> p.x, p.y
1 2
>>> p[0], p[1]
1 2
В последних версиях Python 3 (3.6 +, я думаю), новое typing
библиотека заставила NamedTuple
класс делать названным кортежами легче создать и более мощный. Наследование от typing.NamedTuple
позволяет Вам использовать docstrings, значения по умолчанию, и ввести аннотации.
Пример (Из документов):
class Employee(NamedTuple): # inherit from collections.NamedTuple
name: str
id: int = 3 # default value
employee = Employee('Guido')
assert employee.id == 3