Передать переменную в самописанный модуль при импорте? - PullRequest
0 голосов
/ 17 октября 2018

Я хочу импортировать несколько настроек в мой текущий скрипт, содержащий внешний модуль с именем settings.py.

В настоящее время я изменяю переменную «animal» вручную перед импортом.

settings.py :

animal='Unicorn' #I want to get rid of this line, and pass the variable during the import.

if animal=='Unicorn':
        fur_color='sparkles'
        number_of_legs=4

if animal=='Centipede':
    fur_color='black'
    number_of_legs=100

if animal =='Cat':
    fur_color='brown'
    number_of_legs=4

Я запускаю:

from settings import fur_color, number_of_legs

и получаю необходимую информацию.

Однако мне нужно пройтись по 3 случаям сейчас.Я не могу этого сделать, так как в моей текущей настройке я должен вручную изменить переменную 'animal' перед импортом.

Как я могу передать animal в настройки, чтобы я мог написать что-то вроде:

for animal in animals:
    from settings import *
    print('A' + animal + ' has ' + str(number_of_legs) + ' and is ' + fur_color)

Желаемый результат будет:

A Unicorn has 4 legs and is sparkles
A Centipede has 100 legs and is black
A Cat has 4 legs and is brown.

Импортироватьmsgstr "внутри цикла НЕ обновляет настройки, не использует imp.reload (настройки).Я в недоумении, что делать здесь.Очевидно, что реальный вариант использования является более сложным.Я действительно надеюсь, что я не выстрелил себе в ногу, храня регистр переменных таким образом !!

Ответы [ 2 ]

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

Это действительно лучше всего сделать, вызвав функцию во внешнем модуле.Это можно сделать следующим образом:

settings.py:

def animal_info(animal):
    if animal=='Unicorn':
        fur_color='sparkles'
        number_of_legs=4
    elif animal=='Centipede':
        fur_color='black'
        number_of_legs=100
    elif animal =='Cat':
        fur_color='brown'
        number_of_legs=4
    return fur_color, number_of_legs

Затем в главном модуле или в интерактивном режиме вы можете просто использовать это:

import settings
for animal in animals:
    fur_color, number_of_legs = settings.animal_info(animal)
    print('A' + animal + ' has ' + str(number_of_legs) + ' and is ' + fur_color)

Если вы работаете с таблицей данных большего размера, чем эта, вы можете рассмотреть возможность использования pandas фрейма данных.Просто сохраните ваши данные в текстовом файле, разделенном запятыми или табуляцией, затем прочитайте их с помощью df = pandas.read_csv(....), установите индекс на основе ваших столбцов поиска, а затем получите доступ к данным, например df.loc[animal, “number of legs”].

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

Модули импортируются только один раз, даже если последующий импорт того же модуля.Это означает, что я не ожидаю, что будет простой способ работать с вашей текущей настройкой.

Я предлагаю определить функцию в settings, которая будет генерировать нужную вам конфигурацию на основе ее строкового ввода:

def get_animal(kind):
    if kind == 'Unicorn':
        fur_color = 'sparkles'
        number_of_legs = 4
    elif kind == 'Centipede':
        fur_color = 'black'
        number_of_legs = 100
    elif kind == 'Cat':
        fur_color = 'brown'
        number_of_legs = 4
    else:
        raise ValueError(f'Invalid animal {kind}!')
    #return dict(fur_color=fur_color, number_of_legs=number_of_legs)
    # or
    return fur_color, number_of_legs

Тогда вы можете получить соответствующий dict как

from settings import get_animal
for animal in animals:
    animal_dict = get_animal(animal)
    # animal_dict['fur_color'] etc. can be accessed
    print('A {animal} has {number_of_legs} legs and is {fur_color}'.format(
         animal=animal, **animal_dict))

Конечно, если ваш вариант использования является чем-то, для чего диктат менее подходит, вы можете определить функцию с помощью возвращаемого значения кортежа, а затем распакуйте это:

from settings import get_animal
for animal in animals:
    fur_color,number_of_legs = get_animal(animal)
    # do complicated stuff here
...