簡體   English   中英

Python使用當前模塊中定義的變量從其他模塊調用函數

[英]Python calling a function from different module using a variable defined in current module

helpers目錄中有一個名為helper_a.py的模塊。 它具有此處定義的所有類和功能。

現在,我想從這里調用一個函數到另一個模塊(不在helpers目錄中),而是向后一個步驟(cd ..)。 init .py)在helpers目錄中。

代碼和錯誤如下:

   from helpers.helper_a import *
   import pandas as pd

   query_train_data = "select * from train;"
   df_train_dataset = pd.read_sql(query_train_data, con=engDps1000)

   query_test_data = "select * from test;"
   df_test_dataset = pd.read_sql(query_test_data, con=engDps1000)

   df_train_data = df_train_dataset
   df_test_data = df_test_dataset

   data_prep_steps() # This function is defined in helpers_a


   Error:

    ---------------------------------------------------------------------------
   NameError                                 Traceback (most recent call last)
   <ipython-input-12-3c88b46f341a> in <module>
   ----> 1 data_prep_steps()

   ~\Desktop\Notebooks\helpers\helper_a.py in data_prep_steps()
   ---> 89     # STEP 1 : CONVERT REQUIRED COLS TO CATEGORIES
        90     for df_name in [df_train_data, df_test_data]:
        91         data_prep_class = data_prep(df_name)

NameError:名稱“ df_train_data”未定義

問題是變量df_train數據是在當前模塊中定義的,我想通過在當前模塊中也調用它來在helpers_a中定義的函數中使用它,但是為什么它不能識別此變量?

注意:也嘗試分配全局變量狀態,但仍不能解決問題

有一種在其他模塊中創建不存在的屬性,方法或函數的解決方案。 它來自單元測試。


from unittest.mock import patch, PropertyMock

from helpers.helper_a import *
import pandas as pd

query_train_data = "select * from train;"
df_train_dataset = pd.read_sql(query_train_data, con=engDps1000)

query_test_data = "select * from test;"
df_test_dataset = pd.read_sql(query_test_data, con=engDps1000)

df_train_data = df_train_dataset
df_test_data = df_test_dataset

with patch('helpers.helper_a.df_test_data',create=True,new_callable=PropertyMock) as df_test_data_mock: #Create tells to create attribute if it does not exist
    with patch('helpers.helper_a.df_train_data', create=True, new_callable=PropertyMock) as df_train_data_mock:  # PropertyMock is used to mock properties 
        df_test_data_mock.return_value = df_test_data
        df_train_data_mock.return_value = df_train_data
        data_prep_steps()  # This function is defined in helpers_a

盡管我同意這樣的觀點,即傳遞這些值會更簡單。 同樣由於python動態特性,您只需在模塊本身上設置這些屬性即可。 此方法更簡單,但是您需要記住在完成之前哪種方法對上下文有害的情況后進行清理。

   import helpers.helper_a
   import pandas as pd

   query_train_data = "select * from train;"
   df_train_dataset = pd.read_sql(query_train_data, con=engDps1000)

   query_test_data = "select * from test;"
   df_test_dataset = pd.read_sql(query_test_data, con=engDps1000)

   helpers.helper_a.df_train_data = df_train_dataset
   helpers.helper_a.df_test_data = df_test_dataset

   helpers.helper_a.data_prep_steps() # This function is defined in helpers_a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM