我可以在Python中的函数中声明一个类吗?

问题描述:

如何在我的CheckForJiraIssueRecord函数中定义class Options我可以在Python中的函数中声明一个类吗?

def CheckForJiraIssueRecord(object): 
    #sys.stdout = open(os.devnull) 
    #sys.stderr = open(os.devnull) 

    class Options: 
     pass 
    options = Options() 

    options.user = 'user' 
    options.password = 'password' 

    try: 
     com = jira.Commands() 
     logger = jira.setupLogging() 
     jira_env = {'home':os.environ['HOME']} 
     command_cat= "cat" 
     server = "http://jira.server.com:8080/rpc/soap/jirasoapservice-v2?wsdl" 
    except Exception, e: 
     sys.exit('config error') 
    try: 
     jira.soap = jira.Client(server) 
     jira.start_login(options, jira_env, command_cat, com, logger) 
     issue = com.run(command_cat, logger, jira_env, my_args) 
    except Exception, e: 
     print sys.exit('data error') 

if __name__ == '__main__': 
    commit_text_verified = verify_commit_text(os.popen('hg tip --template "{desc}"')) 
    #commit_text_verified = verify_commit_text(os.popen('hg log -r $1 --template "{desc}"')) 
    if (commit_text_verified): 
     sys.exit(0) 
    else: 
     print >> sys.stderr, ('[obey the rules!]') 
     sys.exit(1); 

是否有可能在Python中的函数中声明类?

+0

缩进似乎是关闭... –

+0

啊,这是一个很常见的模式,当你需要的类无论出于何种原因,每次不同。 – Dave

+4

为什么人们总是问“我可以做X?”?我的意思是,为什么人们不能尝试它?如果它不起作用,那么可能会问“*我怎么做X?”或者“为了实现我的更大目标,我可以做些什么*而不是*?”。特别是因为这是Python,对于大声哭泣,最简单的语言之一,只是尝试东西。 –

可以,但是:

1)通过函数每一次,Options成为一个单独的类。并不是说你真的能够编写代码来利用(或破坏)这个属性,因为

2)你只能通过函数实例化类,除非你以某种方式明确地将它暴露给全局名称空间。 3)假设你只需要一个具有这些属性的对象 - 即Jira不关心你的类接口,除非能够做到.user.password - 你根本不需要创建自定义类:

from collections import namedtuple 
def CheckForJiraIssueRecord(object): 
    options = namedtuple('Options', 'user password')('user', 'password') 
    # 'user password' are the field names, and ('user', 'password') are the 
    # initialization values. This code creates a type similar to what you had 
    # before, naming it 'Options' internally, but doesn't bind it to a variable. 

    # As you were... 

是的,只需纠正您的缩进,该代码应该工作。每次调用函数时都会创建一个新类。

def CheckForJiraIssueRecord(object): 
    class Options: 
     pass 
    options = Options() 

    options.user = 'user' 
    options.password = 'password' 

是的,你可以。虽然每次调用该函数时,都会得到不同的类。