Как получить доступ к объектам из другого модуля? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть скрипт Python, который определяет пару объектов, подобных этому

# A.py
a - some dict
b - some dict
c - some dict
d - some dict

Теперь у меня есть другой скрипт B.py, в котором я хочу получить доступ к a, b, c, d, но он основанпо какой-то переменной я бы выбрал, какую из них использовать

# By.py
import A as A_objects

input = 'a'

# Since the input is 'a' here, I want to call A_objects.a.value
print(A_objects.input.value) # Does not work

Вот ошибка:

AttributeError: module 'A' has no attribute 'input'

Для меня это звучит как основная проблема, но я не могу найтирешение.Один из подходов, который я имею в виду, - это создать словарь со строкой и такими объектами, как

global_dict = { 'a': a, 'b': b ... }

, и получить объекты / дикты как global_dict.get(input) в B.py Дайте мне знать, какова лучшая практика достижения этогослучай использования.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Ваша проблема не в «доступе к объектам из другого модуля», а в разрешении атрибута (имена, определенные в модуле, становятся атрибутами объекта модуля) по его имени.У вас будет точно такая же проблема для любого объекта, то есть:

class Foo():
    def __init__(self):
        self.a = 42

f = Foo()

name = 'a'

# now how to get 'f.<name>' ?

И общий ответ - встроенная getattr(object, name[, default]) функция:

print(f.a)
print(getattr(f, name))

Так что в вашем случае в B.py, который вам нужен

print(getattr(A_objects, input))

НО, если вы имеете дело с пользовательским вводом (для максимально возможного определения «пользовательских вводов»), вы, скорее всего, захотите явно определить, какие имена допустимыдоступ к нему осуществляется таким образом - использование dict является наиболее очевидным решением:

# a.py

a = {}
b = {}
# etc

registry = {
   "a": a,
   "b": b,
   # etc
}

и:

# B.py
import A
input = 'a'
print(A.registry[input])
0 голосов
/ 03 октября 2018

Вы можете просто сделать getattr(A_objects, input)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...