当前位置: 首页 > 面试题库 >

python解释器能否在重新声明的函数上失败?

艾茂学
2023-03-14
问题内容

在处理足够大的python文件时,我意外地在全局范围内重新定义了一个函数。如果python解释器可以在这些情况下警告我,我将不胜感激。

假设您从以下代码(版本1)开始:

#!/usr/bin/env python

... lots of code ...

def foo(version):
  if version == 1:
    return "Correct"
  return "Oops!"

... lots more code ...

print foo(1)

哪个工作正常:

Correct

然后,您想要更改某些内容,并将其称为版本2。您重写了foo函数,但是您或者没有意识到旧的函数存在,或者忘记了删除它。您最终得到以下结果:

#!/usr/bin/env python

def foo(version):
  if version == 2:
    return "Correct"
  return "Oops!"

... lots of code ...

def foo(version):
  if version == 1:
    return "Correct"
  return "Oops!"

... lots more code ...

print foo(2)

哪个不太好用:

Oops!

我知道python允许这样的代码:

def monkey():
  return "patching"
monkey = "is"
def monkey():
  return {"really": "fun"}

但是,以这种方式使用“ def”似乎是不明智的做法。

有什么办法可以得到这种行为:

#!/usr/bin/env python --def-strict
def foo():
  pass
def foo():
  pass

结果是:

Traceback (most recent call last):
  File ..., line 3, in <module>
NameError: name 'foo' is already defined

问题答案:

您可以创建一个装饰器,该装饰器可以比较函数的名称,也可以将其存储在字典中。如果键已经存在,则可以从装饰器抛出异常!在开发过程中使用此装饰器装饰您的所有功能。完成所有测试后,您就可以摆脱装饰!

就像是

#import sys

if sys.argv[1] == "--def-strict":
    def duplicateFinder(f):
        if globals().has_key(f.__name__):
            raise AttributeError, "This module already has a function %s defined" % f.__name__
        return f
else:
    def duplicateFinder(f):
        return f

@duplicateFinder
def myFunction():
    print "Hello World!"

@duplicateFinder
def myFunction():
    print "Hello World Again!!!"

使用“ python –def-strict脚本名”运行时,这应该引发错误。

编辑:添加您的假设–def-
strict!另外,也不需要保留单独的__functionNames字典。globals()字典足够好。因此,对其进行编辑以反映出相同的含义!



 类似资料:
  • 问题内容: 我有一个名为parseDate的函数,但是当我在我的php页面(它是一个joomla组件页面)上调用它时,出现致命错误:无法重新声明parsedate()(先前在template / ja_zeolite / assets / functions.php:2中声明)第21行的templates / ja_zeolite / assets / functions.php 第2行是函数pa

  • 致命错误:无法在第9行的E:\wamp1\wamp\www\sample.php中重新声明关闭()(先前在E:\wamp1\wamp\www\sample.php: 1中声明) 当我运行这个脚本时,它说不能在第9行中重新声明近()(以前在第1行中被标记)。 即使出现错误,与和相关的值也会传递给css。我在这里做错了什么?我正在调用第9行中的函数。有什么帮助吗?

  • 我知道有很多问题与类似的问题,但我一直在寻找答案,仍然无法找到我的问题。我已经尝试了几种方法来解决这个问题,但我找不到任何解决方案。。。 我代码的一部分:(我不会在其他任何地方使用这个函数) 我得到以下信息: 致命错误:无法在第20行的C:\wamp64\www\myProject-dev\Public\cajas\reposiciones\controller3.php:20中重新声明Valid

  • 我不明白发生了什么事。我严格遵循所有的微软文档,事实上甚至不使用任何我自己的脚本/代码。首先,我按照他们的文档创建Python函数。成功了。https://docs.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-python?tabs=azure-cli、cmd、browser使用命令行工具将Azure功能连

  • 问题内容: 是否可以在不首先完全定义函数的情况下调用函数?尝试执行此操作时,出现错误:“未定义 function_name ”。我来自C ++背景,因此这个问题使我感到困惑。 在工作之前声明该功能: 但是,尝试在未先定义函数的情况下调用该函数会带来麻烦: 在C ++中,一旦将其标头放在函数后,就可以在调用后声明一个函数。 我在这里想念什么吗? 问题答案: Python中一种惯用的方式是编写: 只要

  • 5.1. 函数声明 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。 func name(parameter-list) (result-list) { body } 形式参数列表描述了函数的参数名以及参数类型。这些参数作为局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如

  • 问题内容: 注意 :我已经搜索了很多,例如UITableViewDataSource方法的无效重新声明?不适用于我的情况。因为我的代码中没有重复的文件或类。 我的项目中只有一个AppDelegate.swift文件,文件中只有一个类。但是我有 我在AppDelegate.swift文件中也有以下代码。我得到以下错误。 注意 ,我在项目中使用了重复的类或变量声明,并且代码中只有一次声明。 问题答案:

  • 我很好奇,在声明ArrayList时,这样做有什么区别: 这是: i、 e.未声明<代码>