Совместное использование переменных между модулями

#python #variables #python-3.x #module

#python #переменные #python-3.x #модуль

Вопрос:

У меня такая ситуация:

library_file1.py:

 class A:
    def foo(self):
        print("bar")

    def baz(self):
        pass
  

project_file.py:

 from library_file1 import A
class B(A):
    def baz(self):
        print(the_variable)
  

library_file2.py:

 from project_file import B

the_variable = 7
b = B()
b.foo()   # prints "bar"
b.baz()   # I want this to print "7", but I don't know how
  

Как мне разрешить запись кода в project_file.py , который может обращаться к переменным из library_file2.py ? Единственное решение, о котором я могу думать, это:

project_file.py:

 from library_file1 import A
class B(A):
    def baz(self, the_variable):
        print(the_variable)
  

library_file2.py:

 from project_file import B

the_variable = 7
b = B()
b.foo()
b.baz(the_variable)
  

но это кажется неудобным и не масштабируется до многих переменных, таких как the_variable .

Комментарии:

1. Вы можете использовать список переменных b.baz( [var1, var2] ) или словарь b.baz( {'var1':7, 'var2':9} ) , а затем вам нужно перестроить baz()

2. @furas Но тогда переменные должны были бы использоваться как the_variable[7] , что довольно неясно. Я мог бы передать экземпляр пользовательского класса и сделать the_variable.var1 , что было бы лучше, но я все равно хотел бы избежать этого, если это возможно.

Ответ №1:

Довольно просто: вам нужно, чтобы переменная была в project_file.py вместо library_file2.py . Измените project_file на:

 from library_file1 import A
the_variable = None

class B(A):
    def baz(self):
        print(the_variable)
  

А затем в library_file2 :

 import project_file
from project_file import B

project_file.the_variable = 7
b = B()
b.foo()   # prints "bar"
b.baz()   # prints "7"
  

Использование аргумента также является хорошим решением (вам следует избегать глобальных значений, насколько это возможно).


В Python нет такой вещи, как действительно глобальная переменная. Переменные всегда привязаны к области видимости. Обычно мы говорим, что переменная является «глобальной», когда она находится в области действия модуля.

Самая широкая область — это встроенная область, поэтому теоретически было бы возможно добавить что-то как встроенное. Однако это действительно плохая практика. Также это не устраняет проблему, потому что все файлы могут получить доступ к этому новому встроенному, но они не могут повторно назначить его без явного указания области.