范围不一致的Python变量
python新手,我发现它处理作用域的方式有些奇怪(作为非python开发人员) 我有一个解析参数并通过argparser使用它们的代码 我正在做的事情的简化基本版本:范围不一致的Python变量,python,Python,python新手,我发现它处理作用域的方式有些奇怪(作为非python开发人员) 我有一个解析参数并通过argparser使用它们的代码 我正在做的事情的简化基本版本: import ... def parser(): parser = argparse.ArgumentParser(description='Do stuff') parser.add_argument('-key', dest='key', action='store', required=True)
import ...
def parser():
parser = argparse.ArgumentParser(description='Do stuff')
parser.add_argument('-key', dest='key', action='store', required=True)
parser.add_argument('-start_date', dest='start_date', action='store', required=True)
parser.add_argument('-end_date', dest='end_date', action='store')
return parser.parse_args()
args = get_parser()
client_id = args.key
distance_in_meters = 5000
sdate = args.start_date
start_date = datetime(int(sdate[0:4]),int(sdate[4:6]),int(sdate[6:8]),int(sdate[8:10]))
end_date = datetime(datetime.now().year,datetime.now().month,datetime.now().day,datetime.now().hour,datetime.now().minute)
if args.end_date:
end_date = datetime(int(args.end_date[0:4]),int(args.end_date[4:6]),int(args.end_date[6:8]),int(args.end_date[8:10]))
def search():
# print example for the sake of stack overflow
print "Kicking off search."
print "Client ID:", client_id
print "Distance in Meters:", distance_in_meters
print "Start Date:", start_date
...
search()
这将在出现错误之前打印所有内容。print“Start Date:”,Start_Date
,这是由于UnboundLocalError:分配前引用的局部变量“Start_Date”引起的。
这对我来说通常是有意义的,因为我没有设置任何global
变量
- 为什么它能够打印其他变量
- 为什么将变量更改为
而不是sdate
有效start\u date
sdate = args.start_date
start_date = datetime(int(sdate[0:4]),int(sdate[4:6]),int(sdate[6:8]),int(sdate[8:10]))
然后把它放在search()中:
它会打印出来
基于这个问题:“我的代码应该可以正常工作
更新
我认为start\u date
/end\u date
可能是保留变量
我想我的parser()
中的start\u date
可能是冲突变量。因此,我将start\u date=…
更改为start\u date1=…
并神奇地打印“start date:”,start\u date1
似乎有效
然而,我决定如果这不起作用,那么键(在解析器中)也不应该起作用。因此,我将代码start\u date1=…
更改为key=…
,令人惊讶的是,“打印”开始日期:“,key”仍然有效
所以我想出了一个解决方案,但我仍然感到困惑。我在python的保留变量列表中没有看到start_date。start_date
在python中肯定不是保留变量
这个问题几乎肯定隐藏在您忽略的代码区域中:
def search():
# print example for the sake of stack overflow
print "Kicking off search."
print "Client ID:", client_id
print "Distance in Meters:", distance_in_meters
print "Start Date:", start_date
... #<- This bit
嗯。我明白了。python处理这个问题的方式很有趣。和我习惯的非常不同。谢谢。
>>> s = 1
>>> def f():
... print s
>>> print f()
1
>>> s = 1
>>> def g():
... print s
... s = 2
>>> print g()
Traceback (most recent call last):
UnboundLocalError: local variable 's' referenced before assignment