是的,从技术上讲,您可以使用“纯 python”创建网页,但您肯定不想这样做!编程最美妙的部分是有数以百万计的其他人努力创建“框架”,例如Flask 或Django,它们极大地简化了开发应用程序所需的工作。
如果您的目标是“只是学习”,那么使用您不熟悉的框架是一个很好的开始方式。学习编程不是关于运行代码的各个方面所需的技术知识,而是关于了解如何为您尝试构建的特定应用程序提出正确的问题。
程序员懒惰。如果代码中有可以使用的捷径,你应该使用它(除非你有充分的理由不这样做)。
想想这个例子:
我有一个转换为字符串的列表:
myStringList = "['foo', 'bar', 'foobar']"
如何将此字符串转换为我的计算机可以解释为列表的格式?
我可以做一个这样的函数:
def stringToList(node_or_string):
if isinstance(node_or_string, str):
node_or_string = parse(node_or_string, mode='eval')
if isinstance(node_or_string, Expression):
node_or_string = node_or_string.body
def _convert_num(node):
if isinstance(node, Constant):
if isinstance(node.value, (int, float, complex)):
return node.value
elif isinstance(node, Num):
return node.n
raise ValueError('malformed node or string: ' + repr(node))
def _convert_signed_num(node):
if isinstance(node, UnaryOp) and isinstance(node.op, (UAdd, USub)):
operand = _convert_num(node.operand)
if isinstance(node.op, UAdd):
return + operand
else:
return - operand
return _convert_num(node)
def _convert(node):
if isinstance(node, Constant):
return node.value
elif isinstance(node, (Str, Bytes)):
return node.s
elif isinstance(node, Num):
return node.n
elif isinstance(node, Tuple):
return tuple(map(_convert, node.elts))
elif isinstance(node, List):
return list(map(_convert, node.elts))
elif isinstance(node, Set):
return set(map(_convert, node.elts))
elif isinstance(node, Dict):
return dict(zip(map(_convert, node.keys),
map(_convert, node.values)))
elif isinstance(node, NameConstant):
return node.value
elif isinstance(node, BinOp) and isinstance(node.op, (Add, Sub)):
left = _convert_signed_num(node.left)
right = _convert_num(node.right)
if isinstance(left, (int, float)) and isinstance(right, complex):
if isinstance(node.op, Add):
return left + right
else:
return left - right
return _convert_signed_num(node)
return _convert(node_or_string)
然后这样称呼它:
myList = stringToList(myStringList)
print(myStringList[0] # [
print(myList[0]) # foo
或者我可以简单地使用默认python库中美妙的ast包并获得相同的结果:
import ast
myList = ast.literal_eval(myStringList)
print(myList[0]) # foo
stringToList 函数的所有功劳归于 ast package 的创建者,因为我只是从源代码中复制了它。
要添加一个创建自己的包/框架的“充分理由”示例,假设我需要使用eval 函数,无论出于何种原因。众所周知,eval 是dangerous,一般来说不应该使用。如果我真的需要使用它,并且没有其他选择(咳咳,literal_eval),唯一的解决方案是创建我自己版本的 eval 函数,以避免出现可利用的代码。