python json дампы и нагрузки не обрабатывают список кортежей [duplicate]

C # имеет встроенный lock, и вы можете использовать его, создав статический объект, для которого все потоки имеют доступ к:

private static object lockObject {get;set;}

public static object LockObject {get{return lockObject ?? lockObject = new object();}}


void YourMethod()
{
   lock(LockObject)  // all other threads will wait for y
   {
      using(var lockFileStream = File.Open("Lock.txt", FileMode.Open, FileAccess.Read, FileShare.None))
      {
         //Do what you need with the file.  
      }

   }
}

Это создает подход Thread Thread для вашей проблемы.

23
задан mrKelley 30 March 2013 в 19:28
поделиться

4 ответа

Вы можете написать высокоспециализированный кодировщик и крючок декодера:

import json

class MultiDimensionalArrayEncoder(json.JSONEncoder):
    def encode(self, obj):
        def hint_tuples(item):
            if isinstance(item, tuple):
                return {'__tuple__': True, 'items': item}
            if isinstance(item, list):
                return [hint_tuples(e) for e in item]
            if isinstance(item, dict):
                return {key: hint_tuples(value) for key, value in item.items()}
            else:
                return item

        return super(MultiDimensionalArrayEncoder, self).encode(hint_tuples(obj))

def hinted_tuple_hook(obj):
    if '__tuple__' in obj:
        return tuple(obj['items'])
    else:
        return obj


enc = MultiDimensionalArrayEncoder()
jsonstring =  enc.encode([1, 2, (3, 4), [5, 6, (7, 8)]])

print jsonstring

# [1, 2, {"items": [3, 4], "__tuple__": true}, [5, 6, {"items": [7, 8], "__tuple__": true}]]

print json.loads(jsonstring, object_hook=hinted_tuple_hook)

# [1, 2, (3, 4), [5, 6, (7, 8)]]
21
ответ дан Florens 21 August 2018 в 09:11
поделиться
  • 1
    Ницца. Совсем аналогично тому, что делает pymongo . Чтобы быть полным, в encode должна быть также dict ветвь. – georg 30 March 2013 в 21:08
  • 2
    Вот почему это специализировано :) В массивах OP нет, по-видимому, в них нет dicts. – Pavel Anossov 30 March 2013 в 21:22
  • 3
    Благодаря! Мне потребовалась минута, чтобы прочитать код, но я понял, и это именно то, что мне нужно. Это то же самое, что я делаю рекурсию на массивах multi-d. Я делаю крючки & quot; вне & quot; json прямо сейчас, так что, возможно, мне стоит прочитать object_hook s. – mrKelley 31 March 2013 в 16:56
  • 4
    Кажется, что не работает ((1, 2), 3), например. Заменить return {'__tuple__': True, 'items': item} на return {'__tuple__': True, 'items': tuple(hint_tuples(e) for e in item)}, может быть? – user189 15 October 2015 в 14:19
  • 5
    означает ли это, если вы вставляете кортеж внутри словаря, а затем пытаетесь сохранить его как json, это не сработает? – Charlie Parker 16 July 2016 в 05:40

Это с помощью simplejson

import simplejson

def _to_json(python_object) :
    if isinstance(python_object, tuple) :
        python_object = {'__class__': 'tuple',
                         '__value__': list(python_object)}
    else :
        raise TypeError(repr(python_object) + ' is not JSON serializable') 

    return python_object

def _from_json(json_object):                                   
    if json_object['__class__'] == 'tuple':
        return tuple(json_object['__value__'])
    return json_object


jsn = simplejson.dumps((1,2,3), 
                       default=_to_json, 
                       tuple_as_array=False)

tpl = simplejson.loads(jsn, object_hook=_from_json)
3
ответ дан fgregg 21 August 2018 в 09:11
поделиться
16
ответ дан Mark Amery 21 August 2018 в 09:11
поделиться

Принципиальная разница между списками python и кортежами является изменчивостью, которая не имеет отношения к представлениям JSON, если вы не планируете изменять внутренние члены списка JSON, а в текстовой форме. Просто переверните списки, которые вы вернетесь в кортежи. Если вы не используете какие-либо пользовательские декодеры объектов, единственными структурированными типами данных, которые вы должны учитывать, являются объекты JSON и массивы, которые выходят как питоны и списки.

def tuplify(listything):
    if isinstance(listything, list): return tuple(map(tuplify, listything))
    if isinstance(listything, dict): return {k:tuplify(v) for k,v in listything.items()}
    return listything

Если вы специализируетесь на декодировании , или хотите, чтобы некоторые массивы JSON были списками python, а другие - кортежами python, вам нужно будет обернуть элементы данных в dict или кортеж, который аннотирует информацию о типе. Это само по себе является лучшим способом повлиять на поток управления алгоритмом, чем на ветвление, основанное на том, что ли это список или кортеж (или какой-либо другой повторяемый тип).

3
ответ дан rhoark 21 August 2018 в 09:11
поделиться
  • 1
    «Принципиальная разность» - & GT; «Основное различие» & quot;, в то врем как его в текстовой форме & quot; - & GT; ", в то время как он находится в текстовой форме & quot; – Urhixidur 10 April 2018 в 17:00
Другие вопросы по тегам:

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