如何遍历名称将动态生成的列表?
boneList_head =['def_neck', 'def_armbase']#hard coded list
itemType='head'# result of a user button press
...
def selectBones():
global itemType
bones =('boneList_'+itemType)# evaluates as a string , not name of a list
for bone in bones:
cmds.select(bone, tgl=True)
Run Code Online (Sandbox Code Playgroud)
问题是骨头被评估为一个字符串,当我需要它作为列表的名称进行评估时.
动态生成变量名称几乎总是一种糟糕的方法.使用字典!
bonedict = {'boneList_head': ['def_neck', 'def_armbase']}
itemType='head'
def selectBones(itemType):
bones = bonedict['boneList_' + itemType]
for bone in bones:
cmds.select(bone, tgl=True)
Run Code Online (Sandbox Code Playgroud)
请忽略我以前的答案(在我的编辑历史中可见),这是愚蠢的,甚至是愚蠢的.但我责怪它在动态变量名称生成上的愚蠢!
让我详细说明为什么动态变量名称生成是一个坏主意.
因为动态变量生成会掩盖变量名称定义.很难说出已定义的内容和未定义的内容,因此很容易意外地重新定义变量.这是潜在错误的主要来源.
因为动态变量操作会隐藏另一层混淆下的状态更改.在某种程度上,无论何时创建字典或列表,都是如此.但人们希望列表和词典需要一些额外的思考.另一方面,变量名称应该简单易懂.当变量定义和重新定义需要深入思考时,出现问题.
因为动态变量生成会污染命名空间.如果你有很多变量需要自动生成它们,那么它们应该存在于它们自己的命名空间中,而不是在函数的本地中,并且绝对不在全局命名空间中.在他的Linux内核风格指南中,Linus Torvalds建议如果一个函数有超过5-10个局部变量,那你就做错了.
因为动态变量生成有助于高耦合,这是一件坏事.如果您将值分配给字典,您可以来回传递该字典,直到奶牛回家,所有人都必须知道的是该字典.如果在模块的全局命名空间中动态创建变量名,那么如果另一个模块想要访问这些变量名,则必须知道它们的生成方式,该模块中定义的其他变量等等.此外,传递变量变得更加复杂 - 您必须传递对模块本身的引用,可能使用sys.modules或其他可疑的构造.
因为动态变量生成是丑陋的.eval看起来整洁干净,但事实并非如此.它可以做任何事情.可以做任何事情的功能都很糟糕,因为你不能乍一看他们在这里做了什么.定义明确的函数可以完成一件事,而且做得很好; 这样,每当你看到这个功能时,你就知道到底发生了什么.当你看到eval,字面上任何事情都可能发生.从这个意义上讲,eval就像goto.该问题与goto不在于你不能正确地使用它; 对于每一种可能的正确使用方式goto,有5亿种可怕的错误使用方法.我甚至不会在这里讨论安全问题,因为最终,这不是真正的问题eval.