是否可以在 Python 中定义允许无效输入的函数
Is it possible to define function that allows invalid input in Python
我已经定义了一个函数来检查我的语句是否有效并将其分配给一个作为字符串提供的变量,因为在分配之前这个变量还不存在。函数如下:
#Check if item is in HTML otherwise appoint NOT FOUND
def try_except(try_statement, variable):
try:
locals()[variable]=try_statement
except:
locals()[variable]="NOT_FOUND"
return(locals()[variable])
此函数工作正常但仅当输入 try 语句产生有效结果时才,这违背了设计函数的全部目的。
例如,以下语句失败:
SHIPPING=try_except(i.find("span", {"id":"item-shipping-price-1"}).text, "SHIPPING")
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-641-adff14bb2f4b> in <module>
----> 1 SHIPPING=try_except(i.find("span", {"id":"item-shipping-price-1"}).text, "SHIPPING")
AttributeError: 'NoneType' object has no attribute 'text'
而设计功能之外的概念完美运行:
try:
locals()["SHIPPING"]=i.find("span", {"id":"item-shipping-price-1"}).text
except:
locals()["SHIPPING"]="NOT_FOUND"
print(locals()["SHIPPING"])
prints: NOT_FOUND
有什么方法可以定义一个不验证输入语句并按要求继续处理的函数吗?
首先:不要用 locals()
做这件事。这是完全没有必要的,因为你的函数正在 return 值(或至少试图),并且调用者正在将它分配给命名变量 anyway。无论如何,这与你的 try/except
问题是正交的,所以我不会再多说了,只是建议如果将来你觉得需要用 locals()
或 [= 做这样的事情15=], 你绝对不应该做那件事.
您的函数不工作的原因是您在调用该函数之前执行引发异常的代码,因此在外部 它的 try 块。您的 try_except
函数需要将 另一个函数 作为其参数,以便它可以在 inside 的 try 块中调用它:
def try_except(func):
"""Return result of calling func, or "NOT FOUND"."""
try:
return func()
except:
return "NOT FOUND"
然后像这样称呼它:
SHIPPING = try_except(lambda: i.find("span", {"id":"item-shipping-price-1"}).text)
请注意,lambda
表达式生成一个零参数函数,该函数将在 return i.find("span", {"id":"item-shipping-price-1"}).text
被调用时执行 。通过将此函数传递给 try_except
,您允许它在 try
块中执行该代码并通过 return 其默认 "NOT FOUND"
值来处理异常。
我已经定义了一个函数来检查我的语句是否有效并将其分配给一个作为字符串提供的变量,因为在分配之前这个变量还不存在。函数如下:
#Check if item is in HTML otherwise appoint NOT FOUND
def try_except(try_statement, variable):
try:
locals()[variable]=try_statement
except:
locals()[variable]="NOT_FOUND"
return(locals()[variable])
此函数工作正常但仅当输入 try 语句产生有效结果时才,这违背了设计函数的全部目的。
例如,以下语句失败:
SHIPPING=try_except(i.find("span", {"id":"item-shipping-price-1"}).text, "SHIPPING")
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-641-adff14bb2f4b> in <module>
----> 1 SHIPPING=try_except(i.find("span", {"id":"item-shipping-price-1"}).text, "SHIPPING")
AttributeError: 'NoneType' object has no attribute 'text'
而设计功能之外的概念完美运行:
try:
locals()["SHIPPING"]=i.find("span", {"id":"item-shipping-price-1"}).text
except:
locals()["SHIPPING"]="NOT_FOUND"
print(locals()["SHIPPING"])
prints: NOT_FOUND
有什么方法可以定义一个不验证输入语句并按要求继续处理的函数吗?
首先:不要用 locals()
做这件事。这是完全没有必要的,因为你的函数正在 return 值(或至少试图),并且调用者正在将它分配给命名变量 anyway。无论如何,这与你的 try/except
问题是正交的,所以我不会再多说了,只是建议如果将来你觉得需要用 locals()
或 [= 做这样的事情15=], 你绝对不应该做那件事.
您的函数不工作的原因是您在调用该函数之前执行引发异常的代码,因此在外部 它的 try 块。您的 try_except
函数需要将 另一个函数 作为其参数,以便它可以在 inside 的 try 块中调用它:
def try_except(func):
"""Return result of calling func, or "NOT FOUND"."""
try:
return func()
except:
return "NOT FOUND"
然后像这样称呼它:
SHIPPING = try_except(lambda: i.find("span", {"id":"item-shipping-price-1"}).text)
请注意,lambda
表达式生成一个零参数函数,该函数将在 return i.find("span", {"id":"item-shipping-price-1"}).text
被调用时执行 。通过将此函数传递给 try_except
,您允许它在 try
块中执行该代码并通过 return 其默认 "NOT FOUND"
值来处理异常。