在导入时将变量传递给自写模块吗?

时间:2018-10-16 22:54:42

标签: python pandas python-import python-module

我想将少量设置导入到我当前的脚本中,该脚本包含一个名为settings.py的外部模块。

目前,我在导入之前手动更改了“动物”变量。

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种情况。我无法执行此操作,因为在当前设置中,必须在导入之前手动更改“动物”变量。

如何将动物传入设置,以便可以编写类似的内容:

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.

循环内的“导入”不会更新设置,使用imp.reload(settings)也不会更新设置。我不知所措。显然,实际用例更加复杂。我真的希望我不会以这种方式逐个存储案例变量来让自己陷入困境!

2 个答案:

答案 0 :(得分:2)

最好通过在外部模块中调用一个函数来完成此操作。可以这样完成:

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”]之类的数据。 / p>

答案 1 :(得分:1)

模块仅导入一次,即使随后再导入同一模块也是如此。这意味着我不希望有一种简单的方法来处理您当前的设置。

我建议在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

然后您可以将相应的字典作为

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))

当然,如果用例不太适合使用dict,则可以使用元组返回值定义函数,然后将其解压缩:

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