Python扁平化我的元组结构

Python扁平化我的元组结构

问题描述:

我想要一个具有映射的python分层数据结构,并且该值将是一个元组。在某些情况下,元组的长度为1.每当元组的长度为1时,Python智能地平整结构。观察下面的示例,它可以在Python解释器中运行。在“另一个场景”中,我预计这个长度是1,但是它已经钻了一层,并且有了基本的步骤。这完全搞砸了我的测试,因为我依靠它作为一个具有命令,函数列表,函数列表的元组。Python扁平化我的元组结构

问题 - 为什么会发生这种情况?我如何让python不要将它弄平?

import os 

def run(): 
    my_scenario = { 
      "scenario_name" : 
      ( # Each scenario is a List of (command, function_list, function_list) 
       # function_list = one function OR tuple of functions 
       (
        "command1", 
        (
         os.path, 
         os.path.exists 
        ), 
        None 
       ), 
       (
        "command2", 
        (
         os.path, 
         os.path.exists 
        ), 
        None 
       ) 
      ) 
     } 
    another_scenario = { 
      "scenario_name" : 
      (
       (
        "command1", 
        (
         os.path, 
         os.path.exists 
        ), 
        None 
       ) 
      ) 
    } 
    for name in my_scenario: 
     print "Full Scenario is %s" % str(my_scenario[name]) 
     print "Length should be 2 -> %s" % len(my_scenario[name]) 
    for name in another_scenario: 
     print "Full Scenario is %s" % str(another_scenario[name]) 
     print "Length should be 1 -> %s" % len(another_scenario[name]) #Prints 3 as it drills one level down 


if __name__ == "__main__": 
    run()  
+0

如果我更换()用[]即,使用左旋在上面的元组ist insted我得到我期望的输出。我不想使用列表,虽然 – 2013-03-07 10:09:26

您需要添加一个逗号:

another_scenario = { 
     "scenario_name": 
     (
      (
       "command1", 
       (
        os.path, 
        os.path.exists 
       ), 
       None 
      ), # <- Note this comma 
     ) 
} 

,使一个元组,否则它只是一种表达。

>>> (1) 
1 
>>> (1,) 
(1,) 
>>> type((1)) 
<type 'int'> 
>>> type((1,)) 
<type 'tuple'> 

事实上,它是逗号定义的元组,而不是括号::

>>> 1, 
(1,) 
>>> 1, 2 
(1, 2) 

的括号是1-元件的元组只能通过逗号的存在从表达式区分只有当你需要定义一个元组需要:

>>>() 
() 
+0

啊,我应该抓住这一点。不幸的是,这使得DSL不友好(虽然我同意这背后的原因)。我不能指望我的情景专家记得添加尾随的“,”。我现在将切换到使用[]列表语法,看起来好一点 – 2013-03-07 10:39:04