Разделение кортежей в Python - лучшая практика?

Я использую этот метод, и теперь он работает:

if ( IsWindow( hwnd ) )
{

DWORD dwStyle = GetWindowLongPtr( hwnd, GWL_STYLE ) ;
DWORD dwExStyle = GetWindowLongPtr( hwnd, GWL_EXSTYLE ) ;
HMENU menu = GetMenu( hwnd ) ;

RECT rc = { 0, 0, width, height } ;

AdjustWindowRectEx( &rc, dwStyle, menu ? TRUE : FALSE, dwExStyle );

SetWindowPos( hwnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOMOVE ) ;

}
13
задан andygeers 3 September 2008 в 13:48
поделиться

9 ответов

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

, Например:

job={}
job['jobid'], job['label'], job['username']=<querycode>
13
ответ дан Chris Upchurch 3 September 2008 в 13:48
поделиться
  • 1
    +1 для Mark' s комментарий. Даже Microsoft' s владеют кодом doesn' t передают 100% FxCop. Пример, MVC3 нарушает правило " URIs не должен быть strings" повсеместно. Также, если Вы добавляете Сервисную Ссылку из VS и имеете его, генерируют клиент WCF от WSDL, тот сгенерированный код doesn' t передают 100% также. – CodingWithSpike 10 January 2012 в 17:44

Возможно, это - излишество для Вашего случая, но я испытал бы желание создать класс "Задания", который берет кортеж в качестве его аргумента конструктора и имеет соответствующие свойства на нем. Я тогда раздал бы экземпляры этого класса вместо этого.

3
ответ дан Ryan Duffield 3 September 2008 в 13:48
поделиться

@Staale

Там является лучшим путем:

job = dict(zip(keys, values))
14
ответ дан Aaron Maenpaa 3 September 2008 в 13:48
поделиться
  • 1
    Большинство доступных типов должно не , объявляют финализатор; я установил бы это, тип должен вообще только использовать финализатор для инициирования очистки (а не диагностические предупреждения), если собственная цель состоит в том, чтобы управлять единственным неуправляемым ресурсом, и никакая ссылка на любой экземпляр никогда не будет представляться никакому коду кроме своего владельца. Любые другие объекты, которые инкапсулировали бы один или несколько неуправляемых ресурсов, должны инкапсулировать каждый такой ресурс в объекте, на который он содержит единственную ссылку. Обратите внимание, что такой дизайн защитит finalizable объекты от внешнего GC.SuppressFinalize вызовы. – supercat 2 June 2014 в 18:59

Я использовал бы словарь. Можно преобразовать кортеж в словарь этот путь:

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])

Это сначала создаст массив [["jobid", val1], ["маркировка", val2], ["имя пользователя", val3]] и затем преобразовывать это в словарь. Если порядок результата или изменения количества, просто необходимо изменить список ключей для соответствия новому результату.

пз, все еще новый на Python самостоятельно, таким образом, могли бы быть лучшие пути от выполнения этого.

2
ответ дан Staale 3 September 2008 в 13:48
поделиться

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

, Если Вы хотите что-то с немного более дружественным синтаксисом, что Вы могли бы хотеть смотреть на ответы этот вопрос о простом 'подобном структуре' объекте. Тем путем можно раздать объект, сказать job и получить доступ к его полям еще более легко, чем кортеж или dict:

job.jobId, job.username = jobId, username
0
ответ дан Community 3 September 2008 в 13:48
поделиться

Как насчет этого:

class TypedTuple:
    def __init__(self, fieldlist, items):
       self.fieldlist = fieldlist
       self.items = items
    def __getattr__(self, field):
       return self.items[self.fieldlist.index(field)]

Вы могли тогда сделать:

j = TypedTuple(["jobid", "label", "username"], job)
print j.jobid

должно быть легко подкачать self.fieldlist.index(field) с поиском по словарю позже..., просто редактируют Ваш __init__ метод! Что-то как Staale делает.

-2
ответ дан Daren Thomas 3 September 2008 в 13:48
поделиться

Старый вопрос, но так как никто не упомянул это, я добавлю это из Поваренной книги Python:

Рецепт 81252: Используя dtuple для Гибкого Доступа Результата запроса

Этот рецепт специально предназначен для контакта с результатами базы данных, и dtuple решение позволяет Вам получать доступ к результатам по имени ИЛИ индексу. Это избегает необходимости получать доступ ко всему нижним индексом, который очень трудно поддержать, как отмечено в Вашем вопросе.

2
ответ дан Jay 4 September 2008 в 00:48
поделиться

Это старый вопрос, но ...

Я бы предложил использовать именованный кортеж в этой ситуации: collections. namedtuple

Это часть в В частности, что вы сочтете полезным:

Создание подклассов бесполезно для добавления новых сохраненных полей. Вместо этого просто создайте новый именованный тип кортежа из атрибута _fields.

5
ответ дан 1 December 2019 в 19:15
поделиться

Если вы используете пакет MySQLdb, вы можете настроить объекты курсора так, чтобы они возвращали кортежи вместо кортежей.

import MySQLdb, MySQLdb.cursors
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor)
cur = conn.cursor() # a DictCursor
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor
0
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: