使用 元组或字典中的参数调用参数 apple 函数
def function(a, b):
print(a, b)
# 元组为 第 2 个参数
apple(funciton, ("whither", "canada?")
# 字典为 第 3 个参数
apple(function, ("whither"), {"b": "canada?"})
加载 __import__ 函数
from-import 其实是靠内建函数 __import__ 来工作的
import glob, os
modules = []
# 导入所有以"-plugin"结尾的模块
form module_file in glob.glob("*-plugin.py"):
try:
module_name, ext = os.path.splitext(os.path.basename(module_file))
module = __import__(module_name)
modules.append(module)
except ImportError:
pass
modules[0].hello() # 调用函数
# 获取模块中的特定函数
def getfunctionbyname(module_name, function_name):
module = __import__(module_name)
return getattr(module, function_name)
print(repr(getfunctionbyname("dumbdbm", "open"))
# 延迟导入,如 string 模块只在第一次使用的时候导入
class LazyImport:
def __init__(self, module_name):
self.module_name = module_name
self.module = None
def __getattr__(self, name):
if self.module is None:
self.module = __import__(self.module_name)
return getattr(self.module, name)
string = LazyImport("string")
print(string.lowercase)
重载 reload 函数
import hello
reload(hello)
reload(hello)
注意:重载时,它会被重新编译,新的模块会代替模块字典的老模块。但是,已经用原模块里的类建立的实例仍然使用的是老模块。
关于名称空间 dir 函数 或 vars 函数
dir 返回由给定模块、类、实例或其他类型的所有成员组成的列表。这在交互式 Python 下很有用
def dump(value):
print value, "=>", dir(value)
import sys
dump(0)
dump(1.0)
dump(0.0j) # complex number
dump([]) # list
dump({}) # dictionary
dump("string")
dump(len) # function
dump(sys) # module
# 获取类的所有成员
class A:
def a(self):
pass
def b(self):
pass
class B(A):
def c(self):
pass
def d(self):
pass
def getmembers(klass, members=None):
# get a list of all class members, ordered by class
if members is None:
members = []
for k in klass._ _bases_ _:
getmembers(k, members)
for m in dir(klass):
if m not in members:
members.append(m)
return members
print(getmembers(A))
print(getmembers(B))
print(getmembers(IOError))
检测对象类型 type 函数
检查一个对象是否可调用 callable 函数
判断一个对象是否为给定类的实例 isinstance 函数 或 issubclass 函数
class A:
pass
a = A()
if isinstance(a, A):
print("A")
计算表达式 eval 函数
可以传入一串文本、简单的表达式,或者使用内建 Python 函数
注意:如果你不确定字符串来源的安全性,那么你在使用 eval 的时候需要注意。
print(eval("__import__('os').getcwd()") #
print(eval("__import__('os').remove('file')") # 删除了某个文件
# 针对 cpu 和内存资源的攻击
eval("'*'*1000000*2*2*2*2*2*2*2")
编译和执行代码 compile 和 exec 函数
如果要处理大块的代码,使用 compile 和 exec,代码生成工具
BODY = """
print('the ant, an introduction')
"""
code = compile(BODY,"