2011-09-21 93 views
1

如何在我的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,對於大聲哭泣,最簡單的語言之一,只是嘗試東西。 –

回答

2

可以,但是:

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... 
6

是的,只需糾正您的縮進,該代碼應該工作。每次調用函數時都會創建一個新類。

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

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

是的,你可以。雖然每次調用該函數時,都會得到不同的類。

相關問題