【问题标题】:How to create a function that prints or returns results of another function?如何创建一个打印或返回另一个函数结果的函数?
【发布时间】:2017-05-12 17:39:38
【问题描述】:

我创建了一个函数 (p_r),该函数将 printreturn 函数的结果。

我这样做是为了运行测试。 (print 显示输出,return 将吐出值但不打印输出)。 - Python菜鸟;所以,让我知道是否有更简单的方法可以做到这一点,比如“详细”或测试关键字。我已经从事这个项目好几天了。

需要模块...

import random

变量:

yt_url = '' #url of either a video or playlist [user input]
printr_return = True
yt_url1 = 'https://youtu.be/WaGRTixwkSQ'
yt_url2 = 'https://www.youtube.com/playlist?list=PL6FhCd_HO_AD-22-Csv-vYlhLoKlAY3Zt'

功能:

#Switches between printing or returning data, depending on printr_return
#''' 
def p_r (statement, printr_return):
    if printr_return is True:
        print (statement)
    else:
        return (statement)
#'''

问题:

我不明白为什么在以下函数中使用p_r 时会得到NoneType

#Choses between the two urls above and outputs yt_url
#'''
def random_urltest (yt_url1, yt_url2):
    rnt = random.choice([1,2])
    if rnt == 1:
        yt_url = yt_url1
    if rnt == 2:
        yt_url = yt_url2
    p_r (yt_url, False)    #-- what's wrong here?
    #return yt_url          #-- but this works
#'''

运行它:

yt_url = random_urltest (yt_url1, yt_url2) #returns NoneType if I use p_r
p_r ('Running test on url...%s' % (yt_url), True) #This works...

【问题讨论】:

  • 编辑您的帖子以包含您收到的确切错误消息。
  • 看起来你会更适合使用日志工具,比如内置的logging module。你不能编写一个代表其调用者返回的函数,并且让你的函数有条件地不返回东西似乎是一个糟糕的主意。
  • 不管这个具体的例子是否有效,一个只返回或打印它接收到的参数的函数没有意义按原样
  • 什么是错误信息?
  • 你没有在 random_urltest 返回任何东西!

标签: python python-2.7 function random


【解决方案1】:

试着放在最后

return (p_r (yt_url, False))

而不仅仅是运行函数

【讨论】:

  • 是的。做到了!虽然,在查看了一些关于 logging module 的其他回复后,这些回复可能会扼杀对我创建的功能的需求。我会对此进行研究,然后再决定哪种解决方案最适合我的需求。 :)
【解决方案2】:
def random_urltest (yt_url1, yt_url2):
     rnt = random.choice([1,2])
     if rnt == 1:
         yt_url = yt_url1
     if rnt == 2:
         yt_url = yt_url2
     val = p_r (yt_url, False)
     if val:
         return val

【讨论】:

  • if val:if val is None: 的更短的反向替代品吗?
  • 它们是等价的,因为如果 val = 0 则不评估“if val”。但在你的情况下,它们是等价的
【解决方案3】:

您显然希望random_urltest() 函数返回一个值:

yt_url = random_urltest (yt_url1, yt_url2)

但是这个函数没有返回任何东西!正如@bell-_-0001 建议的那样,您需要返回它的值,而不仅仅是调用p_r()

def random_urltest (yt_url1, yt_url2):
    rnt = random.choice([1,2])
    if rnt == 1:
        yt_url = yt_url1
    if rnt == 2:
        yt_url = yt_url2
    return p_r (yt_url, False)

【讨论】:

  • 啊!该解决方案有效〜我还将研究@user2357112提到的logging module。这可能会更好
【解决方案4】:

原来我是“试图重新发明轮子”...

user2357112 对我的整体问题给出了最佳答案(尽管John Gordonmohammad 的答案直接解决了我的问题)

我可以使用内置的logging module 来调试/测试 - 和disable logging

如何使用该模块的详细信息很详尽,但我引用了The Hitchhiker's Guide to Python 并快速更改了代码以显示它是如何工作的...

变化包括

  • 添加logging module
  • 创建logging 配置为logger
  • logger 对象替换我的p_r 函数
  • 简化了random_urltest 函数

进口:

import random
import logging

创建记录器配置Formats info

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
        '%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

变量:

yt_url = '' #url of either a video or playlist [user input]
yt_url1 = 'https://youtu.be/WaGRTixwkSQ'
yt_url2 = 'https://www.youtube.com/playlist?list=PL6FhCd_HO_AD-22-Csv-vYlhLoKlAY3Zt'

功能:

#Choses between the two urls above and outputs yt_url
#'''
def random_urltest (yt_url1, yt_url2):
     yt_url = random.choice([yt_url1, yt_url2])
     logger.debug('Running test on url...%s',yt_url)
     return yt_url
#'''

运行它:

random_urltest (yt_url1, yt_url2)

输出: : url 会在 url1 和 url2 之间切换

2017-05-12 12:48:13,186 root         DEBUG    Running test on url...https://www.youtube.com/playlist?list=PL6FhCd_HO_AD-22-Csv-vYlhLoKlAY3Zt
[Finished in 0.118s]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2021-01-13
    • 2016-04-22
    • 2016-10-12
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多