覆盖a";汇编报表;用python

覆盖a";汇编报表;用python,python,overriding,Python,Overriding,为了便于讨论,让我们假设我想创建一个名为math(已经预定义)的自己的模块,然后从另一个模块导入它。以下是我的代码的目录结构: __init__.py math.py 因此,在\uuuu init\uuuuuuuuy.py中,我希望这样做 from math import whatever 如果我运行\uuuu init\uuuuuuuupy,将选择内置的数学模块,而不是我包含的数学模块,但我想访问我的数学模块。我发现解决这个问题的唯一方法就是简单地将math.py重命名为与mymath.p

为了便于讨论,让我们假设我想创建一个名为math(已经预定义)的自己的模块,然后从另一个模块导入它。以下是我的代码的目录结构:

__init__.py
math.py
因此,在
\uuuu init\uuuuuuuuy.py
中,我希望这样做

from math import whatever

如果我运行
\uuuu init\uuuuuuuupy
,将选择内置的数学模块,而不是我包含的数学模块,但我想访问我的数学模块。我发现解决这个问题的唯一方法就是简单地将math.py重命名为与mymath.py不同的名称。如何在保持模块原始名称的同时完成此操作

通常不赞成替换默认模块——您不知道副作用。我想我应该首先建议您将它放在某个子文件夹中(如果它在“my”文件夹中,您可以
将my.math导入为math
),然后我建议重命名它

如果必须,则可以确保sys.path中的math.py路径是第一个路径。你可以这样做:

import sys, os
sys.path.insert(0,os.getcwd())

首先,将模块命名为stdlib模块是个坏主意。你可能不知道什么时候会被意外的结果绊倒

其次,你所说的是完全可能的

  • 按名称创建目录
    foo
  • 使用您提到的内容创建
    \uuuuu init\uuuuuu.py
  • 创建
    math.py
    ,内容包括
    print“something”
  • 如果你使用python uu init uuu.py你会发现有东西被打印出来了

  • 也许您正在做其他事情?

    如果您的包名为testpack,您可以执行以下操作:

    testpack/myfile.py

    import math
    from testpack import math as mymath
    
    print (math.sin(3))
    print (mymath.hello())
    
    其中testpack/math.py为:

    def hello():
        print ('this is math')
    
    这将为您提供:

    0.14112000806
    this is math
    
    所以你可以使用这两个数学模块

    编辑:为python 3.x更新
    注意:文件夹结构为:

    mypackages\
      __ini__.py
      ..........
      ..........
      testpack\
          __init__.py
          math.py
          myfile.py
    

    为什么它必须有相同的名字?因为我不是模块的原始作者。没有人拿枪指着我的头,但我听从原作者的话。另外,我通过这种方式学到了一些新东西。我重试了,正如我所说的配置。当名称与默认模块相同时,我得到一个ImportError。当名称不同时,程序将一直执行到完成。我使用PyDev,我的默认Python版本目前是3.1.Ok,我发现这是PyDev配置问题(告诉Eclipse src目录是正确的)。这个答案事实上应该是有效的,并且是一个恰当的解释(并且使我感到惊讶)。因此,如果我从mypackage.math导入任何内容,那就足够了。我承认复制默认模块名称是非常糟糕的做法,但我试图在问题部分解释我对这个特定场景的基本原理。