我想在下面的代码中的任何地方调用以下代码MY_MACRO.
# MY_MACRO
frameinfo = getframeinfo(currentframe())
msg = 'We are on file ' + frameinfo.filename + ' and line ' + str(frameinfo.lineno)
# Assumes access to namespace and the variables in which `MY_MACRO` is called.
current_state = locals().items()
Run Code Online (Sandbox Code Playgroud)
以下是一些可以使用的代码MY_MACRO:
def some_function:
MY_MACRO
def some_other_function:
some_function()
MY_MACRO
class some_class:
def some_method:
MY_MACRO
Run Code Online (Sandbox Code Playgroud)
如果它有帮助:
MY_MACRO我需要它的地方的代码.拥有简短易用的东西会非常有帮助.locals().items()(见本的其他问题)这在Python中是否可行?什么是使这个工作最简单的方法?
请注意,宏假定访问调用它的作用域的整个命名空间(即仅将代码MY_MACRO放在函数中不起作用).另请注意,如果我放在MY_MACRO一个函数中,lineno会输出错误的行号.
无法找到更好地标题的方法,随意纠正.
我是Python的新手,目前正在尝试使用该语言.我注意到所有内置类型都不能与其他成员一起扩展.我想例如each在list类型中添加一个方法,但那会不可能.我意识到它是出于效率原因而设计的,并且大多数内置类型都是用C实现的.
好吧,我发现重写此行为的原因之一是定义一个新类,该类扩展list但不执行任何操作.然后我可以将变量分配list给那个新类,每次我想实例化一个新列表时,我都会使用list构造函数,就像它用来创建原始list类型一样.
class MyList(list):
def each(self, func):
for item in self:
func(item)
list = MyList
my_list = list((1,2,3,4))
my_list.each(lambda x: print(x))
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
当然,这个想法可以通过定义获取构建类型的方法并返回扩展该类型的类来概括.此外,原始list变量可以保存在另一个变量中以保持对它的访问.
我现在面临的唯一问题是,当你list通过它的文字形式(即[1,2,3,4])实例化它时,它仍将使用原始列表构造函数(或者它是什么?).有没有办法覆盖这种行为?如果答案是否定的,您是否知道其他一些方法可以让用户扩展内置类型?(就像javascript允许扩展内置原型).
我发现内置插件的这种限制(无法向其添加成员)是Python的一个缺点,使其与其他用户定义的类型不一致......总的来说我真的很喜欢这种语言,我真的不明白为什么这样绝对是必要的.
在我的项目中,我必须经常重复这部分代码:
class SimplePhysicObject(Object):
def __init__(self):
super(Object, self).__init__('SimplePhysicObject')
Run Code Online (Sandbox Code Playgroud)
但不是SimplePhysicObject每次都有新的字符串.有没有办法编写一些宏来使这项工作更容易?就像是:
DoTemplate(NewObject)
==>
class NewObject(Object):
def __init__(self):
super(Object, self).__init__('NewObject')
Run Code Online (Sandbox Code Playgroud)
UPD抱歉,Object我之前在代码中声明了我自己的类