首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于abseil图书馆旗帜的澄清

关于abseil图书馆旗帜的澄清
EN

Stack Overflow用户
提问于 2021-10-06 19:48:10
回答 2查看 786关注 0票数 1

阿拉伯文本文件中有一项声明如下:

当一个Python模块导入另一个模块时,它可以访问另一个模块的标志。(通过让所有模块共享一个包含所有标志信息的通用全局注册表对象来实现此行为。)

当一个模块导入另一个模块(访问另一个模块的标志)时,情况正好相反吗?换句话说,被导入的模型是否也可以访问导入模型的标志?就行为而言,情况似乎是这样。一般的规则是,任何两个具有某种导入连接的python文件都可以访问对方的标志,并且这个条件是传递的吗?

这里有三个文件,说明了我所指的行为。

sample.py

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-06 20:21:10

当你是设置FLAGS = flags.FLAGS时,你就是进口 flags._flagvalues.FLAGS

flags._flagvalues.FLAGSFlagValues已定义_flagvalues中的一个实例

它们都可以访问相同的标志的原因是因为它们引用同一个对象,所以任何文件都可以引用相同的标志。

如果您想要覆盖它,您可以创建一个新的FlagValues实例,并通过将它作为参数传递给它添加标志。

代码语言:javascript
复制
NEW_FLAGS = flags.FlagValues()
new_flag = flags.DEFINE_string('name', 'default', 'help', flag_values=NEW_FLAGS)

flag_values的默认参数总是_flag_values.FLAGS

票数 0
EN

Stack Overflow用户

发布于 2022-10-13 22:45:40

正在导入的模型是否也可以访问导入模型的标志?就行为而言,情况似乎是这样。

我不知道这个推论是否正确。

在我的测试中,似乎:

  • sample2.py导入sample.py时,sample.py可以访问sample2.py中的标志,但sample2.py不能访问sample.py:中定义的标志
    • 下面的示例中的FLAGS.Flag1是在sample2.py中定义的,可以在sample.py中访问。

代码语言:javascript
复制
- But `FLAGS.name` defined in `sample.py` cannot be accessed in `sample2.py`

如果我们简化一下你的例子,比如:

sample.py

代码语言:javascript
复制
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:

代码语言:javascript
复制
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.")

运行上述程序时:

代码语言:javascript
复制
(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: name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69471891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档