我正在创建一个简单的容器系统,其中我的对象(名为GeneralWidget
的类的所有子级)被分组在一些容器中,这些容器位于另一组容器中,依此类推,直到所有容器都在一个全球容器。
我有一个名为GeneralContainer
的自定义类,其中我必须覆盖__str__
方法以为我的容器提供描述名称,因此我知道在他内部存储了什么类型的对象或容器。
我目前正在编写另一个名为ObjectTracker
的类,其中存储了对象的所有位置,因此在创建新对象时,它会在__init__
中为其提供一个名称为“{1}}的列表在我的hieracy中它的“父”的方法,它将自己添加到列表并传递给它。在某个时刻,此列表包含位于新创建的GeneralWidget
实例之上的所有对象,将到达全局GeneralWidget
(包含所有容器和小部件),可以访问ObjectTracker
- 对象中的main()
对象。我的ObjectTracker
。
这是我的问题的背景。我的ObjectRepository
有一个字典,其中每个“第一级容器”都是一个键,这样一个容器内的所有对象也存储在字典中。所以我有
许多封装的词典。
由于我不知道会有多少级别的容器,我需要一个动态语法,它与我需要传递给unil的dictionarys的数量无关。我到达了我想要的BIG词典中的位置。我的self._OBJECTREPOSITORY[firstlevelcontainer12][secondlevel8][lastlevel4] = myNewObject
类中的(静态)调用需要看起来像这样:
firstlevelcontainer12
secondlevel8
包含lastlevel4
,其中包含exec()
,其中应放置新对象
但我既不知道容器的调用方式,也不知道容器的数量,所以我决定使用ObjectTracker
并组成一个包含所有名称的字符串。我将在此处发布我的实际代码,即class ObjectTracker:
def __init__(self):
self._NAMEREPOSITORY = {}
def addItem(self, pathAsList):
usableList = list(reversed(pathAsList))
string = "self._NAMEREPOSITORY"
for thing in usableList:
if usableList[-1] != [thing]:
string += "[" + str(thing) + "]"
else:
string += "] = " + str(thing)
print(string)
exec(string)
:
__str__
问题在于我已经覆盖了类GeneralContainer
的{{1}}方法和GeneralWidget
来重新描述一个描述名称。这在许多场合非常方便,但现在它已经成为一个大问题。上面的代码只有在自定义名称与对象实例的名称相同时才有效(当然,我明白了!)
问题是:是否存在内置函数来执行以下操作:
>>> alis = ExampoleClass()
>>> DOESTHISEXIST(alis)
'alis'
如果不是,如何在不破坏我的良好工作命名系统的情况下编写自定义文件?
答案 0 :(得分:1)
注意:由于我不确定您的需求,我将尝试提供一般解决方案。
首先,避免像黑瘟一样/**
* Parse URL
*
* This method is meant to transform the human readable URL back into
* query parameters. It is only executed when SEF mode is switched on.
*
* @param array &$segments The segments of the URL to parse.
*
* @return array The URL attributes to be used by the application.
*/
public function parse(&$segments)
{
while (!empty($segments))
{
$segment = array_pop($segments);
if (is_numeric($segment))
{
// It's the ID
$vars['id_tsi'] = (int) $segment;
}
else
{
// It's the view
$vars['view'] = $segment;
}
}
return $vars;
}
。 There are serious problems one encounters when using them, 几乎总是更好的方式。这是我在下面提出的方式:
您似乎想要一种方法来找到某个嵌套字典,并给出特定键的列表。这可以使用for循环非常容易地完成并递归遍历所述字典。例如:
eval/exec
如果您需要分配某个嵌套字典的特定部分,也可以使用上面的代码完成:
>>> def get_value(dictionary, keys):
value = dictionary
for key in keys:
value = value[key]
return value
>>> d = {'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4, }, 'g': 5}}
>>> get_value(d, ('b', 'e', 'f'))
4
>>>
以下是上述函数的正式版本,包含错误测试和文档(以自定义样式):
>>> dd = get_value(d, ('b', 'e')) # grab a dictionary object
>>> dd
{'f': 4}
>>> dd['h'] = 6
>>> # the d dictionary is changed.
>>> d
{'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4, 'h': 6}, 'g': 5}}
>>>
答案 1 :(得分:0)
我想你可能正在寻找vars()
。
a = 5
# prints the value of a
print(vars()['a'])
# prints all the currently defined variables
print(vars())
# this will throw an error since b is not defined
print(vars()['b'])