【问题标题】:Can you dynamically assign variables inside a Python function? [duplicate]您可以在 Python 函数中动态分配变量吗? [复制]
【发布时间】: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 合并到本地来更新它们;我只是不认为它有迫切的需求——它使静态检查工具无法处理你的代码,所以只有当你有更令人信服的理由而不是一点点简洁时才应该这样做。跨度>

标签: python function


【解决方案1】:

如果未找到密钥,则使用 get 默认为 None

替换

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 api_key:
    dialect = sql_yaml[api_key].get('dialect')
    driver = sql_yaml[api_key].get('driver')
    host = sql_yaml[api_key].get('host')
    port = sql_yaml[api_key].get('port')
    database = sql_yaml[api_key].get('database')

或与

if api_key:
    dialect,  driver,  host,  port,  database = map(sql_yaml[api_key].get, ['dialect', 'driver', 'host', 'port', 'database'])

【讨论】:

  • 感谢您的帖子。我接受了您的建议并添加了第二个值,因此如果它没有出现在 yaml 文件中,可以通过关键字分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多