【发布时间】:2021-03-31 17:27:55
【问题描述】:
我有这个函数的代码来填充 sqlalchemy 的连接字符串
def sql_path(yaml_path=None, login_key='login', user_key='username',
pass_key='password', api_key=None, dialect=None,
driver=None, host='localhost', port=None, database=None):
with open(yaml_path, 'r') as file:
sql_yaml = yaml.load(file, Loader=yaml.FullLoader)
user = sql_yaml[login_key][user_key]
password = sql_yaml[login_key][pass_key]
pw_encoded = urllib.parse.quote_plus(password)
if api_key is not None:
if 'dialect' in sql_yaml[api_key].keys():
dialect = sql_yaml[api_key]['dialect']
if 'driver' in sql_yaml[api_key].keys():
driver = sql_yaml[api_key]['driver']
if 'host' in sql_yaml[api_key].keys():
host = sql_yaml[api_key]['host']
if 'port' in sql_yaml[api_key].keys():
port = sql_yaml[api_key]['port']
if 'database' in sql_yaml[api_key].keys():
database = sql_yaml[api_key]['database']
if port is None:
sql_path = f'{dialect}+{driver}://{user}:{pw_encoded}@{host}/{database}'
else:
sql_path = f'{dialect}+{driver}://{user}:{pw_encoded}@{host}:{port}/{database}'
return sql_path
有没有一种方法可以动态分配 'if api_key...' 块中的变量,而不必为每个变量执行 if 语句?
【问题讨论】:
-
为什么要使用单独的变量?
-
例如,如果你使用
v = sql_yaml[api_key],你可以有sql_path = f'{v["dialect"]}+{v["driver"]}://{v["user"]}:... -
另外,不要使用
if语句,只需使用get。 -
如果您确实想继续使用单独的变量,则可以使用
dialect = sql_yaml[api_key].get('dialect', dialect),不需要if。 -
当然,是可以通过将 dict 合并到本地来更新它们;我只是不认为它有迫切的需求——它使静态检查工具无法处理你的代码,所以只有当你有更令人信服的理由而不是一点点简洁时才应该这样做。跨度>