在Python中,整个文件可以只是一个变量?

问题描述:

我看到一个JavaScript项目已经在自己的文件中定义了非常大的变量,名称与变量相同,例如名为marker的大数组位于名为marker.js的文件中。方便地,变量可以直接用于任何导入或直接使用,直接访问它,就好像它在同一个文件中一样。在Python中,整个文件可以只是一个变量?

现在我在一个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, 
     }, 

...

的代码是正常的,这:

谢谢

更新 我的 “非常大的变量” 基本上是最详细的地理,我可以需要结构化,以便大型变量摆脱应用程序逻辑的方式。

+3

你是什么意思的“大变量”? –

+0

示例http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/data.json –

这是一个非常好的主意,特别是如果这些值是定义常量或查找表。

下面是一个查找表的一些代码,我的工作的摘录(开源,所以我不会泄露任何秘密):

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 
+0

谢谢Paul!我现在只想知道什么是文件,什么是模块。我将文件和变量命名为相同的东西,并且在python认为我的字典是一个模块时遇到了将我的字典转换为列表的问题。无论如何,我可以用许多不同的方式解决这个问题我的代码不符合的部分是''location_map_india = sorted(location_map_india.iteritems(),key = lambda x:x [1] ['name'])' –

我不完全确定你的问题,但不是modules是什么?


例如:我有一些拉链码逻辑和一个大蟒数据结构包含实际邮编:

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,shelvejson

+0

太棒了!我想要的似乎是可能的。我现在用我的实际变量更新问题 –

+1

@miku:我有一个问题。使用'import zipcodes'语句在'zipcodelogic.py'中导入'zipcodes.py'后的'zipcodes'列表,可以通过'zipcodes.zipcodes'访问 - 对吗?如果是这样,那么也许值得一提的是,在给定的例子中,实际变量被命名为'zipcodes.zipcodes',除非使用'from zipcodes import zipcodes'语句导入? – Tadeck

+1

@Tadeck,是的,这是正确的+在我的答案中添加了一个简短的注释。 – miku

我不是100%肯定,我完全理解你的要求......

而且我不知道,如果它只是一个语言问题,但你提到你的价值观为变量不因为常数,所以我不知道模块是否真的是你想要的[在python中 - 严格来说 - 没有真正的常量。为了达到这个答案的目的,我将这些变量的值视为“常量”,其值不会改变,并且在源代码中而不是在运行时分配。

但是:在Python,标准的方式来获得变量(在运行时分配=值)经由pickleshelve模块的持久性。另一方面,模块是导入常量的标准方式,但为了防止命名空间污染,您必须小心使用它们。

例如,一个标准的方式来加载常数的样子:

from pygame.locals import * 

这工作,但如果你的模块中,你还有其他的进口量(如果pygame.locals你写from numpy import sum,例如),你最终会 - 在文件中导入locals时 - sum被定义为numpy.sum而不是标准sum内置函数...这被称为“命名空间污染”

为了避免这种情况,但仍然能够导入locals在源代码中,你可以定义模块变量__all__即白名单时,模块与星(*)运营商进口将要导入的对象。

HTH!

+0

我添加了一个“变量”,是的,它你现在可以检查一个常数。 –

当然这是一个好主意,正如Miku和Paul已经解释过的那样。还有另一种选择是将数据存储在csv文件或xml中,但我认为只有在其他程序(不是用python写入)必须直接访问该数据时才值得这样做。

+0

你说得对!谢谢你的回答。 –