我创建的脚本实际上是其他用户在上面编写代码的环境。
我已经在一个类中声明了几种方法并实例化了一个对象,以便用户可以将这些方法用作简单的解释器函数,如下所示:
from code import interact
class framework:
def method1(self, arg1):
# code for method1
def method2(self, arg2):
# code for method2
def main():
fw = framework()
# Aliases
method1 = fw.method1
method2 = fw.method2
interact(local=locals())
由于我不希望用户使用fw.method1(arg)
调用方法,因此我设置了别名。问题是,由于框架类正在开发中,因此我必须使用创建的方法的新别名不断更新主脚本。
是否有一种简单的方法来消除调用中的“ fw.
”部分,并使类框架下的所有方法在main下自动可见?
答案 0 :(得分:4)
您可以控制传递给header: {
height: 65,
items: user.login ? [{
xtype:'avatest',
},{
xtype:'button',
text: user.login ? 'up' : 'in',
cls:'mainbuttons',
handler: function() {
user.login ? window.location.assign("/accounts/logout/") : Ext.Viewport.toggleMenu('right');
}
},{
xtype:'button',
text:'info',
cls:'mainbuttons',
margin: '0, 2 , 8, 0'
}] : [{
xtype:'button',
text: user.login ? 'up' : 'in',
cls:'mainbuttons',
handler: function() {
user.login ? window.location.assign("/accounts/logout/") : Ext.Viewport.toggleMenu('right');
}
},{
xtype:'button',
text:'О сервисе',
cls:'mainbuttons',
margin: '0, 2 , 8, 0'
}],
title : {
text : 'MYAPP(pre-alpha)',
cls: 'header-cls'
},
},
的字典,因此不必在interact
中使用局部变量就可以在其中放置所需内容:
main
这适用于常规,静态和类方法。它看不到实例属性(除非它们隐藏了类属性)或继承的方法。
仅当实例将函数存储为属性时,前者才重要(在这种情况下,您可能希望或不希望它们可用)。后者的便利之处在于它省略了d={}
for n in vars(framework):
if n.startswith('_'): continue # probably
x=getattr(fw,n)
if callable(x): d[n]=x
interact(local=d)
;如果还有其他基类,则可以通过搜索object
来轻松地将它们包括在内(并且仍然省略framework.__mro__
)。
答案 1 :(得分:1)
我不知道您打算如何使用这些函数,但是如果它们不是static
,则可能无法在该类之外使用:
fs = [func for func in dir(c) if callable(getattr(c, func)) and not func.startswith("__")]
for func in fs:
globals()[func] = getattr(c, func)
这会将c
类中的所有自定义函数置于全局范围内。
答案 2 :(得分:0)
您基本上想做两件事:
前者可以使用标准库中的canceled=stripe.Subscription.list(
plan='plan_Elm8GW7mwgDj5S',
stripe_account=stripe_keys['acct_num'],
)
for cancel in canceled.auto_paging_iter():
customer_id=cancel.customer
cd=cancel.created
canceled_date=datetime.datetime.fromtimestamp(cd).strftime('%m-%d-%Y')
stripe.Customer.modify(
customer_id,
stripe_account=stripe_keys['acct_num'],
metadata={'Status': 'Canceled',
'Canceled On': canceled_date}
)
模块来实现,后者可以使用inspect
来实现。
尝试以下操作:
vars
答案 3 :(得分:0)
这里类似于@Davis Herring的回答,充实并重新包装:
#from code import interact
def interact(local):
local['method1'](42)
local['method2']('foobar')
class Framework:
def method1(self, arg1):
print('Framework.method1({!r}) called'.format(arg1))
def method2(self, arg2):
print('Framework.method2({!r}) called'.format(arg2))
def get_callables(obj):
return {name: getattr(obj, name) for name in vars(obj.__class__)
if callable(getattr(obj, name))}
def main():
fw = Framework()
# # Aliases
# method1 = fw.method1
# method2 = fw.method2
interact(local=get_callables(fw))
if __name__ == '__main__':
main()
输出:
Framework.method1(42) called
Framework.method2('foobar') called