В Python весь файл может быть просто переменной? - PullRequest
1 голос
/ 20 ноября 2011

Я видел, что проект javascript определил очень большие переменные в своих собственных файлах, названных так же, как переменные, например, большой массив с именем marker находился в файле marker.js. Удобно, чтобы переменную можно было использовать напрямую с любым импортом или около того, напрямую обрабатывая его, как если бы он находился в том же файле.

Теперь у меня есть большие переменные в проекте Python, и мне интересно, смогу ли я сделать что-то подобное, например, перестроить очень большой список в отдельный файл или это невозможно / не очень хорошая идея?

Спасибо

Обновление Моя "очень большая переменная" - это, по сути, самая подробная география, которую я могу:

location_map_br = {
    1: {
        'name': 'São Paulo'.decode('utf-8'),
        'lat': -23.55,
        'long': -46.64,
        'radius': 294200,
        },
    2: {
        'name': 'Rio De Janeiro',
        'lat': -22.90,
        'long': -43.21,
        'radius': 294200,
        },

...

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

Ответы [ 4 ]

3 голосов
/ 20 ноября 2011

Я не совсем уверен в вашем вопросе, но разве не для этого нужны модули ?


Пример: у меня есть некоторая логика zipcode и большая структура данных pythonсодержит фактические почтовые индексы:

zipproj/zipcodelogic.py
zipproj/zipcodes.py

, где zipcodes.py будет выглядеть как

zipcodes = [
    ('10304', 'Richmond County, NY'),
    ... 
    # and over 42,000 more zipcodes
    # http://en.wikipedia.org/wiki/ZIP_code#Statistics
    ...
]

В zipcodelogic.py вы будете просто import zipcodes (и дескриптор списка будет zipcodes.zipcodes).

В других случаях можно также посмотреть сериализацию объектов, например, через pickle , shelve или json .

2 голосов
/ 20 ноября 2011

Это очень хорошая идея, особенно если эти значения определены как константы или справочные таблицы.

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

DCOM_ERROR_CONSTANTS = {
    1726:'RPC_S_CALL_FAILED',
    0:'WBEM_NO_ERROR',
    0x40001:'WBEM_S_ALREADY_EXISTS',
    0x40002:'WBEM_S_RESET_TO_DEFAULT',
    0x40003:'WBEM_S_DIFFERENT',
    0x40004:'WBEM_S_TIMEDOUT',
    0x40005:'WBEM_S_NO_MORE_DATA',
    0x40006:'WBEM_S_OPERATION_CANCELLED',
    0x40007:'WBEM_S_PENDING',
    0x40008:'WBEM_S_DUPLICATE_OBJECTS',
    0x40009:'WBEM_S_ACCESS_DENIED',
    0x40010:'WBEM_S_PARTIAL_RESULTS',
    0x40011:'WBEM_S_NO_POSTHOOK',
    0x40012:'WBEM_S_POSTHOOK_WITH_BOTH',
    0x40013:'WBEM_S_POSTHOOK_WITH_NEW',
    0x40014:'WBEM_S_POSTHOOK_WITH_STATUS',
    0x40015:'WBEM_S_POSTHOOK_WITH_OLD',
    0x40016:'WBEM_S_REDO_PREHOOK_WITH_ORIGINAL_OBJECT',
    0x40017:'WBEM_S_SOURCE_NOT_AVAILABLE',
    0x80041001:'WBEM_E_FAILED',
    0x80041002:'WBEM_E_NOT_FOUND',
    0x80041003:'WBEM_E_ACCESS_DENIED',
    0x80041004:'WBEM_E_PROVIDER_FAILURE',
    0x80041005:'WBEM_E_TYPE_MISMATCH',
    0x80041006:'WBEM_E_OUT_OF_MEMORY',
    0x80041007:'WBEM_E_INVALID_CONTEXT',
    0x80041008:'WBEM_E_INVALID_PARAMETER',
    0x80041009:'WBEM_E_NOT_AVAILABLE',
    0x8004100A:'WBEM_E_CRITICAL_ERROR',
    0x8004100B:'WBEM_E_INVALID_STREAM',
    0x8004100C:'WBEM_E_NOT_SUPPORTED',
    0x8004100D:'WBEM_E_INVALID_SUPERCLASS',
    0x8004100E:'WBEM_E_INVALID_NAMESPACE',
    0x8004100F:'WBEM_E_INVALID_OBJECT',
    0x80041010:'WBEM_E_INVALID_CLASS',
    0x80041011:'WBEM_E_PROVIDER_NOT_FOUND',
    0x80041012:'WBEM_E_INVALID_PROVIDER_REGISTRATION',
    0x80041013:'WBEM_E_PROVIDER_LOAD_FAILURE',
    0x80041014:'WBEM_E_INITIALIZATION_FAILURE',
    0x80041015:'WBEM_E_TRANSPORT_FAILURE',
    0x80041016:'WBEM_E_INVALID_OPERATION',
    0x80041017:'WBEM_E_INVALID_QUERY',
    0x80041018:'WBEM_E_INVALID_QUERY_TYPE',
    0x80041019:'WBEM_E_ALREADY_EXISTS',
    0x8004101A:'WBEM_E_OVERRIDE_NOT_ALLOWED',
    0x8004101B:'WBEM_E_PROPAGATED_QUALIFIER',
    0x8004101C:'WBEM_E_PROPAGATED_PROPERTY',
    0x8004101D:'WBEM_E_UNEXPECTED',
    0x8004101E:'WBEM_E_ILLEGAL_OPERATION',
    0x8004101F:'WBEM_E_CANNOT_BE_KEY',
    0x80041020:'WBEM_E_INCOMPLETE_CLASS',
    0x80041021:'WBEM_E_INVALID_SYNTAX',
    0x80041022:'WBEM_E_NONDECORATED_OBJECT',
    0x80041023:'WBEM_E_READ_ONLY',
    0x80041024:'WBEM_E_PROVIDER_NOT_CAPABLE',
    0x80041025:'WBEM_E_CLASS_HAS_CHILDREN',
    0x80041026:'WBEM_E_CLASS_HAS_INSTANCES',
    0x80041027:'WBEM_E_QUERY_NOT_IMPLEMENTED',
    0x80041028:'WBEM_E_ILLEGAL_NULL',
    0x80041029:'WBEM_E_INVALID_QUALIFIER_TYPE',
    0x8004102A:'WBEM_E_INVALID_PROPERTY_TYPE',
    0x8004102B:'WBEM_E_VALUE_OUT_OF_RANGE',
    0x8004102C:'WBEM_E_CANNOT_BE_SINGLETON',
    0x8004102D:'WBEM_E_INVALID_CIM_TYPE',
    0x8004102E:'WBEM_E_INVALID_METHOD',
    0x8004102F:'WBEM_E_INVALID_METHOD_PARAMETERS',
    0x80041030:'WBEM_E_SYSTEM_PROPERTY',
    0x80041031:'WBEM_E_INVALID_PROPERTY',
    0x80041032:'WBEM_E_CALL_CANCELLED',
    0x80041033:'WBEM_E_SHUTTING_DOWN',
    0x80041034:'WBEM_E_PROPAGATED_METHOD',
    0x80041035:'WBEM_E_UNSUPPORTED_PARAMETER',
    0x80041036:'WBEM_E_MISSING_PARAMETER_ID',
    0x80041037:'WBEM_E_INVALID_PARAMETER_ID',
    0x80041038:'WBEM_E_NONCONSECUTIVE_PARAMETER_IDS',
    0x80041039:'WBEM_E_PARAMETER_ID_ON_RETVAL',
    0x8004103A:'WBEM_E_INVALID_OBJECT_PATH',
    0x8004103B:'WBEM_E_OUT_OF_DISK_SPACE',
    0x8004103C:'WBEM_E_BUFFER_TOO_SMALL',
    0x8004103D:'WBEM_E_UNSUPPORTED_PUT_EXTENSION',
    0x8004103E:'WBEM_E_UNKNOWN_OBJECT_TYPE',
    0x8004103F:'WBEM_E_UNKNOWN_PACKET_TYPE',
    0x80041040:'WBEM_E_MARSHAL_VERSION_MISMATCH',
    0x80041041:'WBEM_E_MARSHAL_INVALID_SIGNATURE',
    0x80041042:'WBEM_E_INVALID_QUALIFIER',
    0x80041043:'WBEM_E_INVALID_DUPLICATE_PARAMETER',
    0x80041044:'WBEM_E_TOO_MUCH_DATA',
    0x80041045:'WBEM_E_SERVER_TOO_BUSY',
    0x80041046:'WBEM_E_INVALID_FLAVOR',
    0x80041047:'WBEM_E_CIRCULAR_REFERENCE',
    0x80041048:'WBEM_E_UNSUPPORTED_CLASS_UPDATE',
    0x80041049:'WBEM_E_CANNOT_CHANGE_KEY_INHERITANCE',
    0x80041050:'WBEM_E_CANNOT_CHANGE_INDEX_INHERITANCE',
    0x80041051:'WBEM_E_TOO_MANY_PROPERTIES',
    0x80041052:'WBEM_E_UPDATE_TYPE_MISMATCH',
    0x80041053:'WBEM_E_UPDATE_OVERRIDE_NOT_ALLOWED',
    0x80041054:'WBEM_E_UPDATE_PROPAGATED_METHOD',
    0x80041055:'WBEM_E_METHOD_NOT_IMPLEMENTED',
    0x80041056:'WBEM_E_METHOD_DISABLED',
    0x80041057:'WBEM_E_REFRESHER_BUSY',
    0x80041058:'WBEM_E_UNPARSABLE_QUERY',
    0x80041059:'WBEM_E_NOT_EVENT_CLASS',
    0x8004105A:'WBEM_E_MISSING_GROUP_WITHIN',
    0x8004105B:'WBEM_E_MISSING_AGGREGATION_LIST',
    0x8004105C:'WBEM_E_PROPERTY_NOT_AN_OBJECT',
    0x8004105D:'WBEM_E_AGGREGATING_BY_OBJECT',
    0x8004105F:'WBEM_E_UNINTERPRETABLE_PROVIDER_QUERY',
    0x80041060:'WBEM_E_BACKUP_RESTORE_WINMGMT_RUNNING',
    0x80041061:'WBEM_E_QUEUE_OVERFLOW',
    0x80041062:'WBEM_E_PRIVILEGE_NOT_HELD',
    0x80041063:'WBEM_E_INVALID_OPERATOR',
    0x80041064:'WBEM_E_LOCAL_CREDENTIALS',
    0x80041065:'WBEM_E_CANNOT_BE_ABSTRACT',
    0x80041066:'WBEM_E_AMENDED_OBJECT',
    0x80041067:'WBEM_E_CLIENT_TOO_SLOW',
    0x80041068:'WBEM_E_NULL_SECURITY_DESCRIPTOR',
    0x80041069:'WBEM_E_TIMED_OUT',
    0x8004106A:'WBEM_E_INVALID_ASSOCIATION',
    0x8004106B:'WBEM_E_AMBIGUOUS_OPERATION',
    0x8004106C:'WBEM_E_QUOTA_VIOLATION',
    0x8004106D:'WBEM_E_RESERVED_001',
    0x8004106E:'WBEM_E_RESERVED_002',
    0x8004106F:'WBEM_E_UNSUPPORTED_LOCALE',
    0x80041070:'WBEM_E_HANDLE_OUT_OF_DATE',
    0x80041071:'WBEM_E_CONNECTION_FAILED',
    0x80041072:'WBEM_E_INVALID_HANDLE_REQUEST',
    0x80041073:'WBEM_E_PROPERTY_NAME_TOO_WIDE',
    0x80041074:'WBEM_E_CLASS_NAME_TOO_WIDE',
    0x80041075:'WBEM_E_METHOD_NAME_TOO_WIDE',
    0x80041076:'WBEM_E_QUALIFIER_NAME_TOO_WIDE',
    0x80041077:'WBEM_E_RERUN_COMMAND',
    0x80041078:'WBEM_E_DATABASE_VER_MISMATCH',
    0x80041079:'WBEM_E_VETO_DELETE',
    0x8004107A:'WBEM_E_VETO_PUT',
    0x80041080:'WBEM_E_INVALID_LOCALE',
    0x80041081:'WBEM_E_PROVIDER_SUSPENDED',
    0x80041082:'WBEM_E_SYNCHRONIZATION_REQUIRED',
    0x80041083:'WBEM_E_NO_SCHEMA',
    0x80041084:'WBEM_E_PROVIDER_ALREADY_REGISTERED',
    0x80041085:'WBEM_E_PROVIDER_NOT_REGISTERED',
    0x80041086:'WBEM_E_FATAL_TRANSPORT_ERROR',
    0x80041087:'WBEM_E_ENCRYPTED_CONNECTION_REQUIRED',
    0x80041088:'WBEM_E_PROVIDER_TIMED_OUT',
    0x80041089:'WBEM_E_NO_KEY',
    0x8004108a:'WBEM_E_PROVIDER_DISABLED',
    # not dcom, but frequently seen
    0x000006be: 'OPERATION_COULD_NOT_BE_COMPLETED',
}

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

from library import DCOM_ERROR_CONSTANTS
1 голос
/ 20 ноября 2011

Конечно, это хорошая идея, и, как уже объяснили Мику и Пол, это возможно.Существуют и другие варианты хранения этих данных в CSV-файле или XML, но я думаю, что это стоит делать, только если какая-то другая программа (не написанная на python) должна иметь прямой доступ к этим данным.

1 голос
/ 20 ноября 2011

Я не уверен на 100%, что полностью понимаю ваши требования ...

Более того, я не знаю, является ли это просто языковой проблемой, но вы называли свои значения переменными , а не константами , поэтому мне интересно, модули действительно то, что вы хотите [в python, строго говоря, нет реальных констант . Для целей этого ответа я рассматриваю в качестве «констант» те переменные, значение которых не изменяется и назначается в исходном коде, а не во время выполнения].

Однако: в python, стандартный способ получить постоянство переменных (= значения, назначенные во время выполнения) через pickle и полки модули . С другой стороны, модули являются стандартным способом импорта констант, но вы должны быть осторожны при их использовании, чтобы предотвратить загрязнение пространства имен.

Например, стандартный способ загрузки константы выглядит так:

from pygame.locals import *

Это работает, но если в вашем модуле у вас были другие операции импорта (например, если в pygame.locals вы написали from numpy import sum), то вы окажетесь в файле при импорте locals - с sum определяется как numpy.sum, а не как стандартная sum встроенная функция ... Это называется "загрязнение пространства имен" .

Чтобы избежать этого, но все еще имея возможность импортировать locals в исходном коде, вы можете определить переменную модуля __all__, которая помещает в белый список объекты, которые будут импортированы при импорте модуля со звездочкой (* 1040) *) оператор.

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...