__all__
настраивает звездочку в from import *
__all__
настраивает звездочку в from import *
Модуль - это файл .py
, предназначенный для импорта.
Пакет - это каталог с файлом __init__.py
. Пакет обычно содержит модули.
""" cheese.py """
__all__ = ['swiss', 'cheddar']
swiss = 4.99
cheddar = 3.99
gouda = 10.99
__all__
позволяет людям знать «общедоступные» функции модуля. [ @AaronHall ] Также pydoc распознает их. [ @Longpoke ]
Посмотрите, как swiss
и cheddar
приведены в локальное пространство имен, но не gouda
:
>>> from cheese import *
>>> swiss, cheddar
(4.99, 3.99)
>>> gouda
Traceback (most recent call last):
File "", line 1, in
NameError: name 'gouda' is not defined
Без __all__
был бы доступен любой символ (который не начинается с подчеркивания).
*
не зависит от __all__
>>> import cheese
>>> cheese.swiss, cheese.cheddar, cheese.gouda
(4.99, 3.99, 10.99)
>>> from cheese import swiss, cheddar, gouda
>>> swiss, cheddar, gouda
(4.99, 3.99, 10.99)
>>> import cheese as ch
>>> ch.swiss, ch.cheddar, ch.gouda
(4.99, 3.99, 10.99)
В файле __init__.py
пакета __all__
представлен список строк с именами общедоступных модулей или других объектов. Эти функции доступны для импорта подстановочных знаков. Как и в модулях, __all__
настраивает *
при импорте подстановочных знаков из пакета. [ @MartinStettner ]
Вот выдержка из Python MySQL Connector __init__.py
:
__all__ = [
'MySQLConnection', 'Connect', 'custom_error_exception',
# Some useful constants
'FieldType', 'FieldFlag', 'ClientFlag', 'CharacterSet', 'RefreshOption',
'HAVE_CEXT',
# Error handling
'Error', 'Warning',
...etc...
]
Импортировать подстановочные знаки ... следует избегать, поскольку они [путают] считыватели и многие автоматизированные инструменты.
blockquote>[ PEP 8 , @ToolmakerSteve]
Если вам действительно нужно это сделать, то закодируйте как данные. Я просто создал новое поле под названием receive
как NSData (двоичные данные).
Затем в реализации NSManagedObject:
-(void)setReceiveList:(NSArray*)list{
self.receive = [NSKeyedArchiver archivedDataWithRootObject:list];
}
-(NSArray*)getReceiveList{
return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive];
}
Вы не храните NSArray
изначально в Базовых данных. Вам необходимо преобразовать значения, хранящиеся в в массиве, во что-то, что Core Data может использовать, а затем сохранить данные в хранилище, чтобы вы могли при необходимости подтолкнуть и вытащить их в свой NSArray
.
Базовые данные хранят экземпляры NSManagedObject или их подклассы. Сам NSManagedObject очень похож на словарь. Отношения ко-многим между объектами представлены в виде наборов. Базовые данные не имеют упорядоченного списка, который бы соответствовал массиву. Вместо этого, когда вы извлекаете объекты из основного хранилища данных, вы используете запрос на выборку. Этот запрос на выборку может указывать один или несколько дескрипторов сортировки, которые используются для сортировки объектов, а объекты, возвращаемые запросом на выборку, сохраняются в массиве.
Если важно сохранить порядок объектов, вам нужно включить в вашу сущность атрибут, который можно использовать для сортировки объектов при их извлечении.
Филип ответил правильно. Вы не храните массивы в Core Data. Это полностью против того, для чего сделаны Основные Данные. Большую часть времени вам не нужна информация о массиве, а одна и та же может быть динамически загружена Core Data. В случае коллекций не имеет значения, если вы перебираете массив ваших свойств или массив извлеченных результатов в NSSet
(который в основном тоже просто массив).
Вот объяснение того, что сказал Филипп. Вы не можете хранить массив напрямую, но вы можете создать список свойств из него. Во всех NS Arraytypes есть метод, который дает вам красивую и чистую строку и основные данные. Крутая вещь в списках свойств, хранящихся в виде строк, заключается в том, что они могут стать такими, какими они были. Для этого есть метод в NSString
. Tataaa ...
Есть цена, конечно. Массивы в виде списков свойств могут стать гигантскими, и это не подходит для устройств iOS, где ОЗУ ограничено. Попытка сохранить массив в базовые данные указывает на плохой дизайн объекта, особенно для больших данных. Небольшой массив в порядке по соображениям скорости.
Другой, менее трудоемкий способ - использовать двоичные списки свойств. Они приближаются к размерам zip при хранении в Core Data или непосредственно в файловой системе. Недостатком является то, что вы не можете просто открыть и прочитать их как файл XML или JSON. Для разработки я предпочитаю что-то читаемое человеком, а для выпуска - бинарную версию. Об этом заботится константа, привязанная к значению DEBUG
в препроцессоре, поэтому мне не нужно менять код.
Преобразуемые атрибуты - это правильный способ сохранения иным образом неподдерживаемых значений объекта в Базовых данных (например, NSArray
). Из Базового руководства по программированию данных: нестандартные постоянные атрибуты :
Идея трансформируемых атрибутов состоит в том, что вы обращаетесь к атрибуту как нестандартному типу, но за кадром Core Data использует экземпляр NSValueTransformer для преобразования атрибута в экземпляр NSData и из него. Базовые данные затем сохраняют экземпляр данных в постоянном хранилище.
Преобразуемый атрибут использует NSValueTransformer для хранения иного неподдерживаемого объекта в постоянном хранилище. Это позволяет Core Data хранить практически все, что может быть представлено как NSData - что может быть очень полезно. К сожалению, трансформируемые атрибуты не могут быть сопоставлены в предикате или использованы при сортировке результатов с помощью NSSQLiteStoreType. Это означает, что трансформируемые атрибуты полезны только для хранения, а не для обнаружения объектов.
Преобразователь по умолчанию позволяет любому объекту, который поддерживает NSCoding
(или NSSecureCoding
), быть сохранен как преобразуемый атрибут. Это включает в себя NSArray
, UIColor
, UIImage
, NSURL
, CLLocation
и многие другие. Не рекомендуется использовать это для данных, которые могут быть произвольно большими, так как это может оказать значительное влияние на производительность при запросе хранилища. Изображения, например, плохо подходят для трансформируемых атрибутов - это большие пакеты байтов, которые фрагментируют хранилище. В этом случае лучше использовать возможности хранения внешних записей Core Data или хранить данные отдельно в виде файла и сохранять URL-адрес файла в Core Data. Если вам необходимо сохранить UIImage
в Базовых данных, убедитесь, что вы знаете, какие компромиссы у вас есть.
Создать преобразуемый атрибут очень просто:
• В редакторе модели данных ядра Xcode выберите атрибут модели, который вы хотите изменить. В инспекторе справа установите тип атрибута как «Трансформируемый». Вы можете оставить поле «Имя» пустым, чтобы использовать преобразователь по умолчанию. Если бы вы использовали собственный преобразователь, вы бы ввели здесь имя класса и зарегистрировали класс, используя +[NSValueTransformer setValueTransformer:forName:]
где-то в вашем коде.
• В заголовке подкласса NSManagedObject
объявите свойство, которое описывает преобразуемый атрибут с правильным типом. В этом случае мы используем NSArray
:
@property (nonatomic, retain) NSArray *transformedArray;
• В файле реализации подкласса NSManagedObject
свойство должно быть динамическим:
@dynamic transformedArray;
И все готово. Когда объект значения NSArray
передается в setTransformedArray:
, этот массив сохраняется объектом. Когда контекст сохранен, Core Data преобразует NSArray
в NSData
, используя NSValueTransformer
, описанный в модели. NSData
байтов будут сохранены в постоянном хранилище.