【问题标题】:GetAttr Function Problems (Python 3)GetAttr 函数问题 (Python 3)
【发布时间】:2012-02-11 15:12:23
【问题描述】:

我在 Python 脚本中有以下内容:

setattr(stringRESULTS, "b", b)

这给了我以下错误:

AttributeError: 'str' object has no attribute 'b'

谁能告诉我这里的问题是什么?

【问题讨论】:

  • 错误信息似乎很清楚......你有什么问题?
  • 我想让动态变量像这样工作:(字符串包含在变量 STRINGRESULTS 中).b =(字符串包含在变量 b 中)我被告知可以与 setattr 一起使用:link但是按照我认为它告诉我在 Python 文档中执行的操作会导致该错误。
  • @EdenCrow:为了清楚起见,您是在尝试将名为“b”的属性添加到 stringRESULTS 对象,还是尝试将名为 b 的属性添加到由 命名的对象 stringRESULTS 的内容,因此如果 stringRESULTS 是字符串“fred”,而 b 是 7,您希望它动态地执行相当于“fred.b = 7”的操作吗?
  • 第二个(在您的示例中,fred.b = 7)。

标签: python function variables python-3.x setattr


【解决方案1】:

不要这样做。引用不可估量的Greg Hewgill

“如果您发现自己使用带引号的名称来引用变量, 通常有更好的方法来做任何你想做的事情。”

[这里你是一个级别,并使用字符串变量作为名称,但这是相同的潜在问题。] 或者 S. Lott 在同一个线程中跟进:

“90% 的时间,你应该使用字典。另外 10% 到时候,你需要完全停止你正在做的事情。”

如果您使用 stringRESULTS 的内容作为指向某个对象 fred 的指针,该对象要指向 setattr,那么您要定位的这些对象必须已经存在于某个地方,而 a dictionary 是自然数据结构存储它们。事实上,根据您的用例,您可能首先可以使用字典键/值对而不是属性。

IOW,我的版本(我猜)你尝试做的可能看起来像

d[stringRESULTS].b = b

d[stringRESULTS]["b"] = b

取决于我是否想要/需要使用对象实例或字典就足够了。

(P.S. 订阅 python-3.x 标签的人相对较少。通常添加裸 'python' 标签也会引起更多关注。)

【讨论】:

  • Re: 标签 - 当您的问题特定于 python 版本 X 时,使用 python-X 标签。如果是通用的,请按照 DSM 的建议使用 python
  • 好的。我将研究在以后的问题中使用字典和使用 python 标签 - 谢谢!
【解决方案2】:

由于 str 是一种低级的原始类型,因此您不能真正在其上设置任何任意属性。您可能需要 dictstr 的子类:

class StringResult(str):
    pass

应该如你所愿:

my_string_result = StringResult("spam_and_eggs")
my_string_result.b = b

编辑:

如果您尝试按照 DSM 的建议进行操作,即。修改与stringRESULTS 变量的值同名的变量的属性,那么这应该可以解决问题:

locals()[stringRESULTS].b = b

请注意,这是一项极其危险的操作,如果您不小心,可能会对您的应用造成各种严重破坏。

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 2011-06-21
    • 1970-01-01
    • 2020-04-23
    • 2016-03-26
    • 2019-02-20
    • 2014-09-18
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多