1

在abseil文档中有一个声明如下:

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

当一个模块导入另一个模块时——获得对另一个标志的访问权——是否反过来呢?换句话说,正在导入的模型是否也可以访问导入模型的标志?就行为而言,情况似乎如此。一般规则是否应该是任何两个具有某种导入连接的python文件都可以访问彼此的标志,并且这个条件是传递的?

以下是三个文件,它们演示了我所指的行为。

示例.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)

样品2.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()

样本3.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()
   
4

1 回答 1

0

当您进行设置时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

于 2021-10-06T20:21:10.343 回答