临时解包字典

Posted

技术标签:

【中文标题】临时解包字典【英文标题】:Temporarily unpack dictionary 【发布时间】:2015-07-28 12:02:26 【问题描述】:

说,我有这样的 dic

my_dictionary = 'a':1,'c':5,'b':20,'d':7

现在,我想用我的 dic 来做这个:

if my_dictionary['a'] == 1 and my_dictionary['d'] == 7:
    print my_dictionary['c']

这看起来很荒谬,因为我正在输入 my_dictionary 3 次!

有没有什么语法可以让我做这样的事情:

within my_dictionary:
    if a == 1 and d == 7:
        print c

如果我的 dic 中没有更多内容(在本例中为 b),这实际上会起作用:

def f(a,d,c):
    if a == 1 and d == 7:
        print c 

f(**my_dictionary)

【问题讨论】:

我的理解是字典一般是针对“不相关的项目”的。但在您的情况下,c 与 a 和 d 有关。需要字典吗?您会始终查找 2 个值并返回第三个值,还是会查找 n 个值? 【参考方案1】:

您可以将您的功能更改为

def f(a,d,c,**args):
    if a == 1 and d == 7:
        print c

那么即使您在字典中有其他项目,它也会起作用。

【讨论】:

酷!我快到了:)【参考方案2】:

您可以使用operator.itemgetter 来最小化多重索引:

>>> if operator.itemgetter('a','d')(my_dictionary)==(1,7):
...      print operator.itemgetter('c')(my_dictionary)

你可以在函数中使用它:

>>> def get_item(*args):
...   return operator.itemgetter(*args)(my_dictionary)
... 
>>> 
>>> if get_item('a','d')==(1,7):
...      print get_item('c')
... 
5

【讨论】:

【参考方案3】:

回答

那么有什么语法可以让我做这样的事情:

within my_dictionary:
if a == 1 and d == 7:
    print c

您可以将 dict 子类化,使其具有 with 魔术方法。为此,该类必须具有__enter____exit__ 方法。然后,您可以将密钥导出到 with 语句的本地范围,并使用 exit 方法清理它们。

使用this answer 我能够创建一个这样做的子类:

import inspect
import ctypes

locals_to_fast = ctypes.pythonapi.PyFrame_LocalsToFast
locals_to_fast.restype = None
locals_to_fast.argtypes = [ctypes.py_object, ctypes.c_int]

class WithDict(dict):
    def __enter__(self):
        frame = self.get_frame()
        for k,v in self.iteritems():
            frame.f_locals[str(k)] = v
            locals_to_fast(frame, 1)

    def __exit__(self, exc_type, exc_value, traceback):
        frame = self.get_frame()
        for k in self.keys():
            del frame.f_locals[str(k)]

    def get_frame(self):
        return inspect.getouterframes(inspect.currentframe())[2][0]

使用原始示例的测试用例

my_dictionary = WithDict('a':1,'c':5,'b':20,'d':7)
with my_dictionary:
    if a == 1 and d == 7:
        print c

打印5

with 语句完成时,变量被删除

【讨论】:

谢谢!这似乎非常有用的信息。我不熟悉with__exit____enter__,对于我的特殊问题,这可能太像用核导弹杀死蜜蜂了。不过似乎是我需要看看的东西。 是的,我在想,当我写它的时候,无论如何这是一个很好的练习。您可以通过猴子修补 dict 并使用字节码操作来使其(甚至更多?)讨厌,这样您就可以真正使用 语法,但这真的就像使用核武器一样!

以上是关于临时解包字典的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 factoryboy 中使用临时非字段变量?

oracle 临时表

临时文件和数据文件的几点差异

Oracle临时表(Temporary Table)

Oracle临时表(Temporary Table)

创建临时用户帐户 - Django