gpt4 book ai didi

python - 由exec(variable =)在for循环中分配的变量范围?

转载 作者:行者123 更新时间:2023-12-03 08:07:08 24 4
gpt4 key购买 nike

我知道大多数人都不喜欢使用exec进行动态分配。但是,出于我的目的,我想将变量名视为数据(实用和古怪)。

考虑一下我在类初始化期间使用的这个示例

现在,我将动态分配给这些变量

 class Example(object):
__tree_dict = {"self.genomedir": "genomes",
"self.pre_align": "pre_alignment",
"self.alignments": "alignments",
"self.trimmed": "trimmed",
"self.prf_pre": "prf_preprocess",
"self.scaled": "scaled",
"self.csv": "csv"}

def __init__(self, rootdir):
self._rootdir = Path(rootdir)
self.outdir = self.mksubdir(self._rootdir, "out")

for variable, human_readable in self.__tree_dict.items():
try:
exec(variable + " = self.mksubdir(self.outdir,human_readable)")
except:
LOGGER.error("%s failed to initialize as %s, defaulting output to root" (variable, human_readable), exc_info=True)
exec(variable + '= Path(self._rootdir)')

该代码将运行,但是我不确定异常处理是否会真正起作用,因为当我添加finally语句将变量赋值写入记录器时,例如
        finally:
LOGGER.info(variable + "set to %s" % getattr(self, variable))

python解释器引发
  AttributeError: 'Example' object has no attribute 'self.csv'

(属性名称在运行时会更改,因为字典未排序-属性本身并不重要)

重要的问题是,当我在for循环范围之外引用新变量时,可以访问它们而不会出现属性错误。它们的分配已经发生,它们是类的属性。这些变量可以在dir(self)中找到,也可以通过self找到。

python在发挥什么功能,阻止我访问for块(或finally块)中的这些变量?

编辑:

一个自包含的示例:
 class Example(object):
__vars_to_be_assigned: {"self.foo": "value", "self.bar": "not foo"}

def __init__(self):
for key, value in self.__vars_to_be_assigned:
try:
exec(key + " = value")
except:
print("Exception!")
else:
print(getattr(self, variable[5:]))

此示例应引发AttributeError

最佳答案

这确实是exec的错误使用。要做的简单得多:

class Example(object):
__tree_dict = {"genomedir": "genomes",
"pre_align": "pre_alignment",
"alignments": "alignments",
"trimmed": "trimmed",
"prf_pre": "prf_preprocess",
"scaled": "scaled",
"csv": "csv"}

def __init__(self, rootdir):
self._rootdir = Path(rootdir)
self.outdir = self.mksubdir(self._rootdir, "out")

for variable, human_readable in self.__tree_dict.items():
try:
setattr(self, variable, self.mksubdir(self.outdir,human_readable))
except:
LOGGER.error("%s failed to initialize as %s, defaulting output to root" (variable, human_readable), exc_info=True)
setattr(self, variable, Path(self._rootdir)

出现错误的原因仅仅是该属性称为 csv,而不是 self.csv。使用 setattr并从 self.中的值中删除 __tree_dict前缀将确保设置和获取值之间的一致性。

关于python - 由exec(variable =)在for循环中分配的变量范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com