如何调用get_data_gsheet时无需传入gspread_connect的参数?
解决方法
以下几种方案可以实现你不需要在get_data_gsheet()内部传入gspread_connect()参数的需求:
方案1:给gspread_connect()设置默认参数
直接在gspread_connect的定义里,把config_section_name和config_section_var设置为你常用的默认值,这样调用时可以省略这两个参数。
修改后的代码:
def gspread_connect(config_section_name="你的默认配置段名", config_section_var="你的默认配置变量名", debug_mode=False): gc = None json_key = os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)),'creds'),get_config_value(config_section_name,config_section_var)) print_text_line(1,"json key: {} is exist? {}".format(json_key,os.path.exists(json_key)),debug_mode) scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] if os.path.exists(json_key): print_text_line(1,"json key exists. Creating credentials...") credentials = ServiceAccountCredentials.from_json_keyfile_name(json_key, scope) print_text_line(1,"credentials created. Authorizing GSpread...") try: gc = gspread.authorize(credentials) print('Gspread authorized') except Exception as e: print_text_line(1,"Authorization with gspread failed.\n{}".format(e)) else: print_text_line(1,'Failed to get credentials. Key is not found.\nLocation: {}'.format(json_key)) return gc def get_data_gsheet(file_id,worksheet_name,debug_mode=False): df = pd.DataFrame() try: # 现在不需要传config参数了,直接调用 gc = gspread_connect(debug_mode=debug_mode) sh = gc.open_by_key(file_id) try: ws = sh.worksheet(worksheet_name) print_text_line(1,"Getting data from '{}' in '{}'...".format(worksheet_name,file_id),debug_mode) data = ws.get_all_records() df = pd.DataFrame(data) print("Getting data completed.\n Total row: {} row(s)".format(df.shape[0])) print_text_line(1,"Sample data:\n{}".format(df.head()),debug_mode) except Exception as e: print("Failed to get data from '{}'".format(worksheet_name)) print(e) except Exception as e: print("Failed to connect with file_id '{}'".format(file_id)) print(e) return df
优点:改动最小,快速生效;需要特殊配置时仍可以手动传参覆盖默认值。
方案2:将已创建的连接对象传入get_data_gsheet()
提前在外部调用gspread_connect()创建好连接,再把这个连接对象作为参数传给get_data_gsheet(),避免内部重复创建连接。
修改后的代码:
def gspread_connect(config_section_name,config_section_var,debug_mode=False): # 原函数代码不变 gc = None json_key = os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)),'creds'),get_config_value(config_section_name,config_section_var)) print_text_line(1,"json key: {} is exist? {}".format(json_key,os.path.exists(json_key)),debug_mode) scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] if os.path.exists(json_key): print_text_line(1,"json key exists. Creating credentials...") credentials = ServiceAccountCredentials.from_json_keyfile_name(json_key, scope) print_text_line(1,"credentials created. Authorizing GSpread...") try: gc = gspread.authorize(credentials) print('Gspread authorized') except Exception as e: print_text_line(1,"Authorization with gspread failed.\n{}".format(e)) else: print_text_line(1,'Failed to get credentials. Key is not found.\nLocation: {}'.format(json_key)) return gc def get_data_gsheet(file_id,worksheet_name, gc=None, debug_mode=False): df = pd.DataFrame() try: # 如果没传gc,再创建(可选,保留兼容);如果传了就直接用 if gc is None: # 这里如果还是不想传参数,可以结合方案1的默认参数 gc = gspread_connect("默认配置段名", "默认配置变量名", debug_mode=debug_mode) sh = gc.open_by_key(file_id) try: ws = sh.worksheet(worksheet_name) print_text_line(1,"Getting data from '{}' in '{}'...".format(worksheet_name,file_id),debug_mode) data = ws.get_all_records() df = pd.DataFrame(data) print("Getting data completed.\n Total row: {} row(s)".format(df.shape[0])) print_text_line(1,"Sample data:\n{}".format(df.head()),debug_mode) except Exception as e: print("Failed to get data from '{}'".format(worksheet_name)) print(e) except Exception as e: print("Failed to connect with file_id '{}'".format(file_id)) print(e) return df # 调用示例 # 先创建连接 gc = gspread_connect("你的配置段名", "你的配置变量名") # 传入连接对象获取数据 df = get_data_gsheet("文件ID", "工作表名", gc=gc)
优点:支持复用连接,避免重复授权,提升效率;灵活性高,可在外部控制连接的创建逻辑。
方案3:使用全局变量存储配置参数
把config_section_name和config_section_var设为全局变量,这样get_data_gsheet()内部可以直接访问,不用传参。
修改后的代码:
# 定义全局配置参数 CONFIG_SECTION_NAME = "你的配置段名" CONFIG_SECTION_VAR = "你的配置变量名" def gspread_connect(config_section_name=None, config_section_var=None, debug_mode=False): # 如果没传参数,用全局变量 if config_section_name is None: config_section_name = CONFIG_SECTION_NAME if config_section_var is None: config_section_var = CONFIG_SECTION_VAR gc = None json_key = os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)),'creds'),get_config_value(config_section_name,config_section_var)) print_text_line(1,"json key: {} is exist? {}".format(json_key,os.path.exists(json_key)),debug_mode) scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] if os.path.exists(json_key): print_text_line(1,"json key exists. Creating credentials...") credentials = ServiceAccountCredentials.from_json_keyfile_name(json_key, scope) print_text_line(1,"credentials created. Authorizing GSpread...") try: gc = gspread.authorize(credentials) print('Gspread authorized') except Exception as e: print_text_line(1,"Authorization with gspread failed.\n{}".format(e)) else: print_text_line(1,'Failed to get credentials. Key is not found.\nLocation: {}'.format(json_key)) return gc def get_data_gsheet(file_id,worksheet_name,debug_mode=False): df = pd.DataFrame() try: # 直接调用,不用传config参数,函数内部会用全局变量 gc = gspread_connect(debug_mode=debug_mode) sh = gc.open_by_key(file_id) try: ws = sh.worksheet(worksheet_name) print_text_line(1,"Getting data from '{}' in '{}'...".format(worksheet_name,file_id),debug_mode) data = ws.get_all_records() df = pd.DataFrame(data) print("Getting data completed.\n Total row: {} row(s)".format(df.shape[0])) print_text_line(1,"Sample data:\n{}".format(df.head()),debug_mode) except Exception as e: print("Failed to get data from '{}'".format(worksheet_name)) print(e) except Exception as e: print("Failed to connect with file_id '{}'".format(file_id)) print(e) return df
优点:配置集中管理,不用在多个地方重复传参;适合配置固定的场景。
方案4:用类封装连接与数据获取逻辑
把连接创建和数据获取封装到类中,初始化时完成连接,后续直接调用方法获取数据,彻底避免参数传递问题。
修改后的代码:
class GSheetHandler: def __init__(self, config_section_name, config_section_var, debug_mode=False): self.debug_mode = debug_mode self.gc = self._connect(config_section_name, config_section_var) def _connect(self, config_section_name, config_section_var): gc = None json_key = os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)),'creds'),get_config_value(config_section_name,config_section_var)) print_text_line(1,"json key: {} is exist? {}".format(json_key,os.path.exists(json_key)),self.debug_mode) scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] if os.path.exists(json_key): print_text_line(1,"json key exists. Creating credentials...") credentials = ServiceAccountCredentials.from_json_keyfile_name(json_key, scope) print_text_line(1,"credentials created. Authorizing GSpread...") try: gc = gspread.authorize(credentials) print('Gspread authorized') except Exception as e: print_text_line(1,"Authorization with gspread failed.\n{}".format(e)) else: print_text_line(1,'Failed to get credentials. Key is not found.\nLocation: {}'.format(json_key)) return gc def get_data(self, file_id, worksheet_name): df = pd.DataFrame() try: sh = self.gc.open_by_key(file_id) try: ws = sh.worksheet(worksheet_name) print_text_line(1,"Getting data from '{}' in '{}'...".format(worksheet_name,file_id),self.debug_mode) data = ws.get_all_records() df = pd.DataFrame(data) print("Getting data completed.\n Total row: {} row(s)".format(df.shape[0])) print_text_line(1,"Sample data:\n{}".format(df.head()),self.debug_mode) except Exception as e: print("Failed to get data from '{}'".format(worksheet_name)) print(e) except Exception as e: print("Failed to connect with file_id '{}'".format(file_id)) print(e) return df # 调用示例 handler = GSheetHandler("你的配置段名", "你的配置变量名") df = handler.get_data("文件ID", "工作表名")
优点:逻辑更清晰,面向对象的方式更易维护;连接只创建一次,复用性强。
内容的提问来源于stack exchange,提问作者Cignitor
相关产品推荐
相关产品推荐

