【问题标题】:import python files, with same function names, in different directories在不同目录中导入具有相同函数名的python文件
【发布时间】:2021-10-16 12:10:21
【问题描述】:

我在不同的目录中有不同的.py文件。

但是,每个类都有大部分相同的函数名称,只是代码方法不同。

我想使用 pytest 一起测试他们的每一个性能。

test_CompositeKey.py:

import os
import pandas as pd

import pytest
from dagster import execute_solid
from CompositeKey.modules.Gordian.Gordian import (add_to_non_key_set, create_prefix_tree, dfs, find_uniqueness_of_keys, get_col_cardinalities, get_final_col_list, get_keyset, non_key_finder, prefix_tree_merging, set_index_to_col_names)
from CompositeKey.modules.Assisted_Gordian.Assisted_Gordian import (add_to_non_key_set, create_prefix_tree, dfs, find_uniqueness_of_keys, get_col_cardinalities, get_final_col_list, get_keyset, non_key_finder, prefix_tree_merging, set_index_to_col_names)
from CompositeKey.modules.Assisted_Gordian_with_Cardinality_Pruning.Assisted_Gordian_with_Cardinality_Pruning import (add_to_non_key_set, create_prefix_tree, dfs, find_uniqueness_of_keys, get_col_cardinalities, get_final_col_list, get_keyset, non_key_finder, prefix_tree_merging, set_index_to_col_names)
from pwmf.pipeline.utils import local_mode

df = pd.read_csv('../data/OPIC-scraped-portfolio-public.csv')
df_sample = df.sample(10)

@pytest.mark.unit
def test_add_to_non_key_set():
    curNonKey = {0, 1, 4, 8, 21}
    global NonKeySet
    NonKeySet = {(0, 1, 4, 21, 6, 8), (0, 1, 4, 21, 6)}
    
# Changes
    observed_value_G = CompositeKey.modules.Gordian.Gordian.add_to_non_key_set(curNonKey, NonKeySet)
    observed_value_AG = CompositeKey.modules.Assisted_Gordian.Assisted_Gordian.add_to_non_key_set(curNonKey, NonKeySet)
    observed_value_AGC = CompositeKey.modules.Assisted_Gordian_with_Cardinality_Pruning.Assisted_Gordian_with_Cardinality_Pruning.add_to_non_key_set(curNonKey, NonKeySet)

    expected_output = {(0, 1, 4, 21, 8), (0, 1, 4, 21, 6, 8), (0, 1, 4, 21, 6)}
    
    assert (expected_output == observed_value_G) and (expected_output == observed_value_AG) and (expected_output == observed_value_AGC)

test_add_to_non_key_set()

错误:

Traceback (most recent call last):
  File "test_CompositeKey.py", line 135, in <module>
    test_add_to_non_key_set()
  File "test_CompositeKey.py", line 21, in test_add_to_non_key_set
    observed_value_AG = CompositeKey.modules.Gordian.Assisted_Gordian.add_to_non_key_set(curNonKey, NonKeySet)
NameError: name 'CompositeKey' is not defined

我检查了文件夹路径,它们是正确的。事实上,我有各种其他类,每个类都导入这些行中的一行,没有问题。

在每个导入文件的目录中创建空的 __init__.py 文件没有帮助。


@blhsing 的解决方案:

import os
import pandas as pd

import pytest
from dagster import execute_solid
from CompositeKey.modules.Gordian import Gordian as G
from CompositeKey.modules.Assisted_Gordian import Assisted_Gordian as AG
from CompositeKey.modules.Assisted_Gordian_with_Cardinality_Pruning import Assisted_Gordian_with_Cardinality_Pruning as AGC
from pwmf.pipeline.utils import local_mode

df = pd.read_csv('../data/OPIC-scraped-portfolio-public.csv')
df_sample = df.sample(10)

@pytest.mark.unit
def test_add_to_non_key_set():
    curNonKey = {0, 1, 4, 8, 21}
    global NonKeySet
    NonKeySet = {(0, 1, 4, 21, 6, 8), (0, 1, 4, 21, 6)}
    
    observed_value_G = G.add_to_non_key_set(curNonKey, NonKeySet)
    observed_value_AG = AG.add_to_non_key_set(curNonKey, NonKeySet)
    observed_value_AGC = AGC.add_to_non_key_set(curNonKey, NonKeySet)

    expected_output = {(0, 1, 4, 21, 8), (0, 1, 4, 21, 6, 8), (0, 1, 4, 21, 6)}
    
    assert (expected_output == observed_value_G) and (expected_output == observed_value_AG) and (expected_output == observed_value_AGC)

【问题讨论】:

    标签: python-3.x import python-import init


    【解决方案1】:

    使用时:

    from CompositeKey.modules.Gordian.Gordian import (add_to_non_key_set ...)
    

    CompositeKey.modules.Gordian.Gordian模块导入add_to_non_key_set,只有名称add_to_non_key_set本身被导入到当前模块的命名空间,而不是模块CompositeKey.modules.Gordian.Gordian或包CompositeKey

    因此,您应该直接使用此名称引用 add_to_non_key_set,就像使用 add_to_non_key_set(curNonKey, NonKeySet) 一样。

    如果您更愿意通过包CompositeKey 引用它,就像您尝试过的那样:

    CompositeKey.modules.Gordian.Assisted_Gordian.add_to_non_key_set(curNonKey, NonKeySet)
    

    你应该将包直接导入到当前模块的命名空间中:

    import CompositeKey
    

    【讨论】:

    • 嗯,好的。让我试试这个。将尽快报告。泰。
    • import CompositeKey.modules ... observed_value_G = Gordian.Gordian.add_to_non_key_set(curNonKey, NonKeySet) ... NameError: name 'Gordian' is not defined。将在我的帖子底部附加完整的尝试。
    • import CompositeKey.modules 不是我在答案中建议的。如果您希望能够使用Gordian,您应该使用from CompositeKey.modules import Gordian
    • 您是否按照答案的建议先尝试了import CompositeKey?然后你就可以打电话给CompositeKey.modules.Gordian.Gordian.add_to_non_key_set(...)
    • 该测试模块不再出现错误!在接受您的解决方案之前,我将在其余这些模块中级联此更改;以防万一。泰。
    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 2016-07-22
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多