python的新手,我在处理范围的方式中发现了一些奇怪的(作为非python dev)行为。
我有一个代码来解析参数并通过argparser使用它们。
缩短我正在做的基本版本:
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: local variable 'start_date' referenced before assignment
这通常对我有意义,因为我没有设置任何global
变量,
sdate
而不是start_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():
内,它会打印出来。
基于这个问题:“What is the scope of variables in JavaScript?”我的代码应该可以正常工作。
更新
我认为start_date
/ end_date
可能是保留变量?
我想我的start_date
中的parser()
可能是某种冲突的变量。所以我将start_date = ...
更改为start_date1 = ...
并且神奇地print "Start Date:", start_date1
似乎有效。
然而,我决定如果这不起作用,那么key
(在解析器中)也不应该工作。所以我将代码start_date1 = ...
更改为key = ...
并且令人惊讶地“打印”开始日期:“,关键”仍然有用。
所以我想出了一个解决方案,但我仍然感到困惑。我没有在python的保留变量列表中看到start_date。
答案 0 :(得分:0)
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
您几乎肯定会在省略的代码中的某个地方{@ 1}}进行分配。如果在函数中的某处为变量名赋值,则即使在赋值之前也无法访问同名的全局变量。有关详细信息,请参阅this SO post。
有关此问题的说明,请尝试以下操作:
start_date