- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图理解一段代码,该代码涉及在调用函数时使用 **kwargs。在阅读了 Pydocs 和 Stackoverflow 上的其他一些帖子后,我尝试以交互方式试验这种语法,但遇到了一些我无法理解其行为的情况:
In [180]: d1 = {'a':'b', 'c':'d'}
In [181]: d2 = {'e':'f', 'g':'h', 'i':'j'}
In [182]: dict(d1, d2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-182-49f16d5922b6> in <module>()
----> 1 dict(d1, d2)
TypeError: dict expected at most 1 arguments, got 2
In [183]: dict(d1, **d2)
Out[183]: {'a': 'b', 'c': 'd', 'e': 'f', 'g': 'h', 'i': 'j'}
In [184]: dict(d1, *d2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-184-0d16a1c0b887> in <module>()
----> 1 dict(d1, *d2)
TypeError: dict expected at most 1 arguments, got 4
In [185]: dict(*d1,d2)
File "<ipython-input-185-d36e77e65d5e>", line 1
dict(*d1,d2)
SyntaxError: only named arguments may follow *expression
In [186]: dict(**d1,d2)
File "<ipython-input-186-fd4b93fcc3c9>", line 1
dict(**d1,d2)
^
SyntaxError: invalid syntax
在我目前正在研究的代码中,我看到正在使用 In [183]
的语法以及目前我对 **d2
的理解,当它是像这样使用的是它将字典对象 d2
扩展到一个看起来像 (e=f, g=h, i=j)
的元组中,所以语句对于 In [183]
可能看起来像(我不确定是哪一个,但我厌倦了我能想到的所有可能性,但没有一个可行,这让我感到困惑):
In [192]: dict({'a':'b', 'c':'d'}, (e=f, g=h, i=j))
File "<ipython-input-192-792b64fb793a>", line 1
dict({'a':'b', 'c':'d'}, (e=f, g=h, i=j))
^
SyntaxError: invalid syntax
对于上面的内容,我认为包围 e=f, g=h, i=j
的方括号可能是问题所在,因为它有效:
In [191]: dict(a=5,l=6)
Out[191]: {'a': 5, 'l': 6}
但是当我删除它们时,我得到:
In [196]: dict({'a':'b', 'c':'d'}, e=f, g=h, i=j)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-196-854a7d483a98> in <module>()
----> 1 dict({'a':'b', 'c':'d'}, e=f, g=h, i=j)
NameError: name 'f' is not defined
仅尝试 e=f, g=h, i=j
部分是行不通的:
In [197]: dict(e=f, g=h, i=j)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-197-b53d153dfd98> in <module>()
----> 1 dict(e=f, g=h, i=j)
NameError: name 'f' is not defined
然后我意识到将 ''
放在 f、h 和 i 周围解决了问题:
In [199]: dict(e='f', g='h', i='j')
Out[199]: {'e': 'f', 'g': 'h', 'i': 'j'}
所以我想我在这里发现的是,key=value 对的右侧不需要定义为字符串或任何对象类型,但为什么会这样呢?
当我回到最初的问题时,我有
In [200]: dict({'a':'b', 'c':'d'}, e='f', g='h', i='j')
Out[200]: {'a': 'b', 'c': 'd', 'e': 'f', 'g': 'h', 'i': 'j'}
终于成功了!
抱歉,如果我不清楚我的问题是什么,那么总结一下,我将列出我所有的问题:
当我执行 In [183]: dict(d1, **d2)
时,它是如何工作的,而且我没有收到任何与参数数量相关的错误,而对于 In [182]: dict(d1, d2)
和 In [184]: dict(d1, *d2)
我有错误告诉我我已经投入了更多dict
的参数比它接受的参数多? d1, **d2
是如何变成一个参数的?
从执行 In [185]: dict(*d1,d2)
和 In [186]: dict(**d1,d2)
,显然第一个字典对象有 *
或 **
是行不通的。为什么不能这样做?例如,为什么 dict(**d1, d2)
不做与 dict(d1, **d2)
相同的事情?
与 Q1 有点相关 - 根据我对 **kwargs
的理解,它以某种方式将字典扩展到它的 key = value
并应用于例如,可能给了我类似 In [200]: dict({'a':'b', 'c':'d'}, e='f', g='h', i= 'j')
因为它运行正确。但这看起来不像有 4 个参数吗?为什么这没有引发错误?
我的最后一个问题是,为什么当使用 key = value
对语法作为 dict
的参数时,我们不需要包含 key
在任何引号中,但只对 value
这样做,尽管键本身也是一个 string
对象,这在成功的 的输出中很明显dict
构造?
非常感谢大家的帮助,如果有任何意见或建议可能与我的问题没有直接关系,我也将不胜感激。这种行为对我来说太晦涩了,我无法理解!
最佳答案
如果您阅读文档 ( https://docs.python.org/2/library/stdtypes.html#typesmapping ),该行为一点都不难理解
请记住,当您调用 dict()
时,您是在调用一个函数。函数具有定义数量的参数,并且这些参数具有定义的顺序。
dict()
一共有三个定义,分别是:
dict(**kwargs)
dict(iterable, **kwargs)
dict(mapping, **kwargs)
这只是语言的设计方式。这应该可以回答您在 (1) 和 (2) 中的问题。
编辑:对于 (3),您认为它扩展了键/值对是正确的。 **kwargs
是 n
个命名参数,因此当您传递 i=1, j=2, k=3
时,您传递的是 3命名参数。如果一个函数以 **kwargs
作为参数定义,这意味着它可以接收 0 到 n
命名参数。普通参数和命名参数之间存在区别。
对于 (4),这只是一个编译器技巧。我猜这是为了方便,但实际上很少使用。我个人还没有看到“现实世界”中使用的 key=value
约定。 YMMV.
关于python - 当使用 **kwargs 语法从 2 个不同的字典形成单个字典对象时,试图理解模糊的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27221600/
我有一个像 s = "title='bah' name='john and jill' purple='haze' none=None i=1" 我正在寻找一种将其放入字典的 Pythonic 方式(
我正在通过教程阅读有关模板 View 的内容,其中一些代码让我感到困惑。作者使用了这个代码示例 from django.utils.timezone import now class AboutUsV
看不懂下面的例子,假设我有这些功能: # python likes def save(filename, data, **kwargs): fo = openX(filename, "w",
假设我们有一个像这样的函数声明 def myfunc(a=None,b=None): as_dict = {"a": a, "b": b,
def a(**akwargs): def b(bkwargs=akwargs): # how to not only use akwargs defaultly,but al
阅读 Python 文档,有几种创建字典的方法。 dict() dict(**kwargs) dict(mapping, **kwargs) dict(iterable, **kwargs) http
两种方法我都见过,但我不明白它们的区别以及我应该将什么作为“最佳实践”: def custom_function(**kwargs): foo = kwargs.pop('foo')
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我需要将 args 和 kwargs 都存储在一个元组中以便稍后调用,那么在这种情况下元组中的适当值是 *args 还是 args?换句话说,这行得通吗: def __init__(self, *ar
我有这个查询 Location.objects.filter(locations_rate__rate=search_rate).distinct('id') 如何将 distinct() 设置为 *
是否可以简化 kwargs 选项的 bool 检查? 例如在 foo 中我必须检查很多选项: def foo(*args, **kwargs): if 'foo' in kwargs and k
我尝试运行 Python Data Science Essential 一书中的一个示例。但是,当我运行它时出现错误。实际上,我才刚刚开始学习 python。所以,我觉得很难修复这些错误。请帮我。这是
我正在尝试使用以下代码在一个大图中创建多个seaborn regplot: %matplotlib notebook import seaborn as sns from itertools impo
我有一个这样的函数:。如果有参数x,则它一定是布尔值。任何其他命名参数必须为int。。其他人将编写调用foo的函数,我希望他们能够传递x和kwargs。目前,这意味着调用foo()的每个函数除了kwa
当一个类继承自单个类时,调用父方法的首选方式是什么?我知道有两种调用父方法的方法。 选项 1: ParentClass.method(self, *args, **kwargs) 选项 2: supe
问题 我在 Dusty Phillips 的 Object Oriented Programming(为简洁起见而简化)中遇到了这段代码,但我不确定这个定义的特定部分。 class A: de
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
我在下面运行了一个装饰器演示。 def logger(func): def inner(*args, **kwargs): print(args) print(
如何使用“一个”类参数**kwargs设置对象属性? 我想要的是在一个循环中执行此代码: class purchase(): def __init__(self,**kwargs):
我是一名优秀的程序员,十分优秀!