我可以在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中的函数中声明类?
答
可以,但是:
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'
答
是的,你可以。虽然每次调用该函数时,都会得到不同的类。
缩进似乎是关闭... –
啊,这是一个很常见的模式,当你需要的类无论出于何种原因,每次不同。 – Dave
为什么人们总是问“我可以做X?”?我的意思是,为什么人们不能尝试它?如果它不起作用,那么可能会问“*我怎么做X?”或者“为了实现我的更大目标,我可以做些什么*而不是*?”。特别是因为这是Python,对于大声哭泣,最简单的语言之一,只是尝试东西。 –