python - 使用 None 作为默认参数时遇到问题
问题描述
我试图了解None
默认参数是如何工作的。我有一个有 4 个参数的函数,第一个是非默认的,然后是 3 个设置的参数=None
。
功能:send(name, website=None, to_email=None, verbose=False)
调用函数:response = send(name, to_email=email, verbose=True)
我的问题是在调用函数时,如果我删除"to_email="
并保持原样email
,则会出现错误,说to_email
是None
。难道它不知道电子邮件是为to_email
参数传递的(因为它是我传递的第二个参数)?为什么我必须明确地说email_to=email
何时参数email_to=None
?
这是我的有效代码:
def send(name, website=None, to_email=None, verbose=False):
assert to_email != None
if website != None:
msg = format_msg(my_name=name, my_website=website)
else:
msg = format_msg(my_name=name)
if verbose:
print(name, website, to_email)
# send the message
send_mail(text=msg, to_emails=[to_email], html=None)
if __name__ == "__main__":
print(sys.argv)
name = "Unknown"
if len(sys.argv) > 1:
name = sys.argv[1]
email = None
if len(sys.argv) > 2:
email = sys.argv[2]
response = send(name, to_email=email, verbose=True)
print(response)
解决方案
未命名的参数按照它们在函数定义中出现的顺序分配给参数。所以如果你写
send(name, email, verbose=True)
email
参数被分配给参数website
,因为这是函数定义中的第二个参数。该to_email
参数获取其默认值None
。
如果要跳过任何参数,则必须使用命名参数。
如果您希望能够以您尝试的方式调用它,则需要重新排序参数:
def send(name, to_email=None, website=None, verbose=False):
现在to_email
是第二个参数。
推荐阅读
- r - 如何为每个元素频率写入新文件
- pytorch - Pytorch AttributeError:模块“火炬”没有属性“set_grad_enabled”
- qt - QML TableView 自定义委托:如何为太长的文本制作省略号
- python - 使用python连接进程stdin/stdout
- javascript - Javascript中条件语句的结构
- couchbase - Couchbase 压缩可用磁盘空间要求
- javascript - 当 chrome 控制台完美解析时,Javascript 无法解析 JSON
- java - 如何从网站检索 html 文件并使用 java 在特定标签之间获取数据
- d3.js - Canvas 中的 D3 强制布局:添加和更新节点(和链接)
- powershell - “请求的阅读器无效。阅读器不存在或已过期”在 SCOM 中获取性能数据时出错