Python - 如何检查特定函数是否正在调用您当前的函数,并在当前函数的 if/else 中使用它?
Python - How to check if a specific function is calling your current function, and use that in an if/else within the current function?
我有以下方法运行并执行返回 ID 的查询:
def _get_ids_from_snowflake(self):
sf_hook = SnowflakeHook(warehouse)
logging.info(f'Query fetching ids...')
sql = f"""
SELECT simple_id, id FROM my_table;
"""
logging.info(f'Query finished!')
return sf_hook.execute_query(queries=sql, fetch_all=True)
现在我想知道是否有办法使 sql 查询在此方法中更加动态,并使用 if 语句将其拆分为 4 个不同的查询,如果我的其他方法 get_response_2021
正在调用 _get_ids_from_snowflake
它使用 sql1 语句:
sql1 = f"""
SELECT simple_id, id FROM my_table where YEAR(id_date) = 2021;
"""
方法 get_response_2022
正在调用 _get_ids_from_snowflake
它使用 sql2 语句:
sql2 = f"""
SELECT simple_id, id FROM my_table where YEAR(id_date) = 2022;
"""
此外,如果这不可能或没有意义,请告诉我为什么我想了解。
可以使用 inspect
模块,但这不是理想或推荐的方法。
最好为方法使用一个参数,作为查询本身的填充物,然后每个调用函数都可以传递不同的填充物作为参数。
例如:
def _get_ids_from_snowflake(self, year=None):
sf_hook = SnowflakeHook(warehouse)
if year:
sql = f"SELECT simple_id, id FROM my_table where YEAR(id_date) = {year};"
else:
sql = "SELECT simple_id, id FROM my_table;"
logging.info('Query fetching ids...')
logging.info('Query finished!')
return sf_hook.execute_query(queries=sql, fetch_all=True)
那么每个调用函数看起来像这样:
def get_response_2021(self):
self._get_ids_from_snowflake(year='2021')
def get_response_2022(self):
self._get_ids_from_snowflake(year='2022')
以防万一您需要按照您描述的方式进行操作,这就是一个示例:
import inspect
class Klass:
def _get_ids_from_snowflake(self):
frame = inspect.stack()[1]
print(frame.function) # prints function name of the caller
if frame.function == "get_response_2022":
sql = f"SELECT simple_id, id FROM my_table where YEAR(id_date) = 2022;"
elif frame.function == "get_response_2021":
...
...
...
logging.info('Query fetching ids...')
logging.info('Query finished!')
return sf_hook.execute_query(queries=sql, fetch_all=True)
def get_response_2021(self):
self._get_ids_from_snowflake() # prints get_response_2021
def get_response_2022(self):
self._get_ids_from_snowflake() # prints get_response_2022
a = Klass()
a.get_response_2021()
a.get_response_2022()
我有以下方法运行并执行返回 ID 的查询:
def _get_ids_from_snowflake(self):
sf_hook = SnowflakeHook(warehouse)
logging.info(f'Query fetching ids...')
sql = f"""
SELECT simple_id, id FROM my_table;
"""
logging.info(f'Query finished!')
return sf_hook.execute_query(queries=sql, fetch_all=True)
现在我想知道是否有办法使 sql 查询在此方法中更加动态,并使用 if 语句将其拆分为 4 个不同的查询,如果我的其他方法 get_response_2021
正在调用 _get_ids_from_snowflake
它使用 sql1 语句:
sql1 = f"""
SELECT simple_id, id FROM my_table where YEAR(id_date) = 2021;
"""
方法 get_response_2022
正在调用 _get_ids_from_snowflake
它使用 sql2 语句:
sql2 = f"""
SELECT simple_id, id FROM my_table where YEAR(id_date) = 2022;
"""
此外,如果这不可能或没有意义,请告诉我为什么我想了解。
可以使用 inspect
模块,但这不是理想或推荐的方法。
最好为方法使用一个参数,作为查询本身的填充物,然后每个调用函数都可以传递不同的填充物作为参数。
例如:
def _get_ids_from_snowflake(self, year=None):
sf_hook = SnowflakeHook(warehouse)
if year:
sql = f"SELECT simple_id, id FROM my_table where YEAR(id_date) = {year};"
else:
sql = "SELECT simple_id, id FROM my_table;"
logging.info('Query fetching ids...')
logging.info('Query finished!')
return sf_hook.execute_query(queries=sql, fetch_all=True)
那么每个调用函数看起来像这样:
def get_response_2021(self):
self._get_ids_from_snowflake(year='2021')
def get_response_2022(self):
self._get_ids_from_snowflake(year='2022')
以防万一您需要按照您描述的方式进行操作,这就是一个示例:
import inspect
class Klass:
def _get_ids_from_snowflake(self):
frame = inspect.stack()[1]
print(frame.function) # prints function name of the caller
if frame.function == "get_response_2022":
sql = f"SELECT simple_id, id FROM my_table where YEAR(id_date) = 2022;"
elif frame.function == "get_response_2021":
...
...
...
logging.info('Query fetching ids...')
logging.info('Query finished!')
return sf_hook.execute_query(queries=sql, fetch_all=True)
def get_response_2021(self):
self._get_ids_from_snowflake() # prints get_response_2021
def get_response_2022(self):
self._get_ids_from_snowflake() # prints get_response_2022
a = Klass()
a.get_response_2021()
a.get_response_2022()