【问题标题】:How to use the output of a function in another function? [closed]如何在另一个函数中使用函数的输出? [关闭]
【发布时间】:2021-07-30 12:50:32
【问题描述】:

我创建了一个函数来从用户那里获取日期并使用strptime 将其转换为datetime 格式。该函数称为Obtaindate()。这将作为另一个函数Getdata() 的输入。现在,在第二个函数Getdata() 中,我需要用timedeltaObtaindate() 中减去日期。但我收到错误TypeError: unsupported operand type(s) for -: 'NoneType' and 'datetime.timedelta'

我应该怎么做才能从第一个函数中获取日期以在第二个函数中工作?

这是代码示例:

def ObtainDate():
   
    isValid=False

    while not isValid:

        userin = str(input("Type Date ddmmyy: "))
        
        try: 
            dt = datetime.datetime.strptime(userin, '%d%m%y')
            print('You have selected {}'.format(datetime.date.strftime(dt, '%d-%b-%Y')))
            break
        except:
            print("Incorrect format...try again!")
            continue

            return dt

ObtainDate()
    
def Getdata():
    
    date1 = ObtainDate() - datetime.timedelta(1)
    date2 = datetime.datetime.today()
    delta = datetime.timedelta(1)
    
    while date1 < date2:

        print('Download in progress...')

【问题讨论】:

  • 你是否从第一个函数返回了一个值?看起来它正在返回None
  • Obtaindate 函数中,使用return dt 而不是break。由于您的代码是在示例中编写的,因此将永远不会达到返回值,因为它位于 之后 continue。因此,该函数返回 None,因为您只中断了 while 循环而不返回任何内容。
  • 跑题了,但a bare except is bad practice,尤其是在多行try-block 上。相反,请使用您期望的特定异常,例如except ValueError,或至少except Exception,并使用else-block 让代码在未发生异常时运行。
  • return dt 的缩进量是应有的两倍。投票结束为错字。
  • @wjandrea jup,就可读性而言,我认为最好使用else: return dt

标签: python function datetime typeerror


【解决方案1】:

试试这个 - cmets inlne 显示 add.mmove/delete

except 不是很好 - 最好捕获特定异常


def ObtainDate():
   
    isValid=False

    while not isValid:

        userin = str(input("Type Date ddmmyy: "))
        
        try: 
            dt = datetime.datetime.strptime(userin, '%d%m%y')
            print('You have selected {}'.format(datetime.date.strftime(dt, '%d-%b-%Y')))

            return dt    ####### moved here
        except:
            print("Incorrect format...try again!")
            continue

# REMOVED        return dt

def Getdata(adate): # ADDED PARAMETER
    
    date1 = adate- datetime.timedelta(1) # USE PARAMETER
    date2 = datetime.datetime.today()
    delta = datetime.timedelta(1)
    
    while date1 < date2:

        print('Download in progress...')
        # ADDED SAVING DATA
        data_for_this_date = …

    # ADDED RETURN
    return data_for_this_date

# ADDED SAVING VALUE OF FUNCTION CALL
theday = ObtainDate()
# ADDED PASSING the result from Obtaindate()
# AND ADDED store result returned by Getdata in a variable
data = Getdata( theday )


【讨论】:

  • 非常感谢您抽出宝贵时间帮助我!我从你的回答中学到了很多。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多