阿拉伯文本文件中有一项声明如下:
当一个Python模块导入另一个模块时,它可以访问另一个模块的标志。(通过让所有模块共享一个包含所有标志信息的通用全局注册表对象来实现此行为。)
当一个模块导入另一个模块(访问另一个模块的标志)时,情况正好相反吗?换句话说,被导入的模型是否也可以访问导入模型的标志?就行为而言,情况似乎是这样。一般的规则是,任何两个具有某种导入连接的python文件都可以访问对方的标志,并且这个条件是传递的吗?
这里有三个文件,说明了我所指的行为。
sample.py
from absl import app
from absl import flags
import sample2
FLAGS = flags.FLAGS
flags.DEFINE_string('name', 'Jane Random', 'Your name.')
def main(argv):
print(FLAGS.name, "is being called in sample.py.")
print(FLAGS.Flag2) #Flag2 is a flag of sample3.py.
sample2.Sample()
if __name__ == '__main__':
app.run(main)sample2.py:
from absl import app
from absl import flags
import sample3
FLAGS = flags.FLAGS
flags.DEFINE_string('Flag1', 'Jane Random', 'Your name.')
class Sample:
def a_method(self):
print(FLAGS.name, "is being called in sample2.py.") #sample.py's flags appear to be accessible even though we're not importing from there.
def __init__(self):
self.a_method()
sample3.Sample()sample3.py
from absl import app
from absl import flags
FLAGS = flags.FLAGS
flags.DEFINE_string('Flag2', 'This is a sample3.py flag.')
class Sample:
def a_method(self):
print(FLAGS.name, "is being called in sample3.py.") #sample.py's flags appear to be accessible even though we're not importing from there.
def __init__(self):
self.a_method()发布于 2021-10-06 20:21:10
当你是设置FLAGS = flags.FLAGS时,你就是进口 flags._flagvalues.FLAGS。
flags._flagvalues.FLAGS是FlagValues类已定义在_flagvalues中的一个实例。
它们都可以访问相同的标志的原因是因为它们引用同一个对象,所以任何文件都可以引用相同的标志。
如果您想要覆盖它,您可以创建一个新的FlagValues实例,并通过将它作为参数传递给它添加标志。
NEW_FLAGS = flags.FlagValues()
new_flag = flags.DEFINE_string('name', 'default', 'help', flag_values=NEW_FLAGS)flag_values的默认参数总是_flag_values.FLAGS
发布于 2022-10-13 22:45:40
正在导入的模型是否也可以访问导入模型的标志?就行为而言,情况似乎是这样。
我不知道这个推论是否正确。
在我的测试中,似乎:
sample2.py导入sample.py时,sample.py可以访问sample2.py中的标志,但sample2.py不能访问sample.py:中定义的标志FLAGS.Flag1是在sample2.py中定义的,可以在sample.py中访问。- But `FLAGS.name` defined in `sample.py` cannot be accessed in `sample2.py`如果我们简化一下你的例子,比如:
sample.py
from absl import app
from absl import flags
import sample2
FLAGS = flags.FLAGS
flags.DEFINE_string('name', 'Jane Random', 'Your name.')
def main(argv):
print(FLAGS.name, "is being called in sample.py.")
print(FLAGS.Flag1) # Flag1 is a flag of sample2.py.
if __name__ == '__main__':
app.run(main)sample2.py:
from absl import app
from absl import flags
FLAGS = flags.FLAGS
flags.DEFINE_string('Flag1', 'Jane Random', 'Your name.')
print(FLAGS.name, "printing from sample2.py.")运行上述程序时:
(venv) jcnarasimhan@hadr-crdhost:~/PycharmProjects/hadr/absl_exploration$ python sample.py
Traceback (most recent call last):
File "/home/jcnarasimhan/PycharmProjects/hadr/absl_exploration/sample.py", line 3, in <module>
import sample2
File "/home/jcnarasimhan/PycharmProjects/hadr/absl_exploration/sample2.py", line 7, in <module>
print(FLAGS.name, "printing from sample2.py.")
File "/home/jcnarasimhan/PycharmProjects/hadr/venv/lib/python3.9/site-packages/absl/flags/_flagvalues.py", line 471, in __getattr__
raise AttributeError(name)
AttributeError: namehttps://stackoverflow.com/questions/69471891
复制相似问题