一种方法是使用import x,而不使用"from"关键字.那么你随处可见它们的命名空间.
还有其他方法吗?喜欢做类似于C++ ifnotdef __b__ def __b__类型的东西?
可能重复:
Python中的循环(或循环)导入
我有B类导入并创建类A的实例.A类需要在其构造函数中引用B,因此包括B.
from a import A
class B:
def __init__(self):
self.a = A()
Run Code Online (Sandbox Code Playgroud)
from b import B
class A:
def __init__(self, ref):
assert isinstance(ref, B)
self.ref = ref
Run Code Online (Sandbox Code Playgroud)
这不起作用.主文件导入B并使用它......不是.进口的东西是错误的.
文件 导入错误:导入错误:无法导入名称B.
我有一个像这样结构的Django项目:
appname/
models/
__init__.py
a.py
base.py
c.py
Run Code Online (Sandbox Code Playgroud)
... appname/models/__ init__.py只包含这样的语句:
from appname.models.base import Base
from appname.models.a import A
from appname.models.c import C
Run Code Online (Sandbox Code Playgroud)
...以及appname/models/base.py包含的位置:
import django.db.models
class Base(django.db.models.Model):
...
Run Code Online (Sandbox Code Playgroud)
以及appname/models/a.py包含的位置:
import appname.models as models
class A(models.Base):
....
Run Code Online (Sandbox Code Playgroud)
...同样适用于appname/models/c.py等.
我很满意我的代码结构,但当然它不起作用,因为循环导入.
当appname/__ init__.py运行时,appname/models/a.py将运行,但该模块导入"appname.models",尚未完成执行.经典循环导入.
所以这应该表明我的代码结构很差,需要重新设计以避免循环依赖.
有什么选择呢?
我能想到的一些解决方案,以及为什么我不想使用它们:
所以我的问题不仅仅是如何避免循环导入,而是以一种与我试图实现的方式一样干净(如果不是更干净)的方式.
有没有人有更好的方法?
我有两个文件需要使用彼此不同的功能.
file1.py:
import file2 # from file2 import y2
def x1():
print "x1"
def x2():
print "x2"
file2.y2()
Run Code Online (Sandbox Code Playgroud)
file2.py:
import file1 # from file1 import x1
def y1():
file1.x1()
print "y"
def y2():
print "y2"
if __name__ == "__main__":
y1()
Run Code Online (Sandbox Code Playgroud)
我想知道为什么使用import file1工作,但从file1(from file1 import x1)导入只是特定的功能不是?
Traceback (most recent call last):
File "file2.py", line 1, in <module>
from file1 import x1
File "file1.py", line 1, in <module>
import file2
File "file2.py", line 1, in <module> …Run Code Online (Sandbox Code Playgroud) 我有a.py和b.py在同一个目录中。在 a.py 中,代码是
A = 'a1'
from b import B
print(B)
Run Code Online (Sandbox Code Playgroud)
在 b.py 中,代码是
B = 'b1'
from a import A
print(A)
Run Code Online (Sandbox Code Playgroud)
现在运行a.py,结果是
b1
a1
b1
Run Code Online (Sandbox Code Playgroud)
我不明白。有人会解释吗?谢谢!
我有两个文件说a.py和b.py.
在a.py中,我们这样做
import xxx
from b import *
Run Code Online (Sandbox Code Playgroud)
在b.py中我们有一个需要的功能module xxx.现在,当b.py从中调用函数时a.py,无法找到该模块xxx.
为什么这可以解决这个问题?我不能做import xxx在b.py出于某种原因.
MCV:
a.py
import xxx
from b import *
fun()
Run Code Online (Sandbox Code Playgroud)
b.py
def fun():
xxx.dosomething()
Run Code Online (Sandbox Code Playgroud)
错误:
Global name xxx not defined
为了防止在使用类型提示时在 Python 中循环导入,可以使用以下构造:
# controllers.py
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from models import Book
class BookController:
def __init__(self, book: "Book") -> None:
self.book = book
Run Code Online (Sandbox Code Playgroud)
仅if TYPE_CHECKING:在类型检查期间执行,而不是在代码执行期间执行。
当应用主动函数参数类型验证(基于参数的类型提示)时,typeguard会抛出错误:
名称错误:名称“Supported_experiment_settings”未定义
# models.py
from controllers import BookController
from typeguard import typechecked
class Book:
@typechecked
def get_controller(self, some_bookcontroller:BookController):
return some_bookcontroller
some_book=Book()
BookController("somestring")
Run Code Online (Sandbox Code Playgroud)
和:
# controllers.py
from __future__ import annotations
from typing import TYPE_CHECKING
from typeguard import typechecked
#from models …Run Code Online (Sandbox Code Playgroud) # File 1
me = MongoEngine(app) # I want to use my instance of MongoEngine to define new classes like the example in File 2
# File 2
class Book(me.Document):
title = StringField(null=False, unique=True)
year_published = IntField(null=True)
Run Code Online (Sandbox Code Playgroud)
在新文件中创建新类时,如何将实例me.Document作为对象定义传递。如果我把它们放在同一个文件中,它会起作用吗?
我认为这比Django更像是一个蟒蛇问题.
但基本上我在模特A做:
from myproject.modelb.models import ModelB
Run Code Online (Sandbox Code Playgroud)
在模型B:
from myproject.modela.models import ModelA
Run Code Online (Sandbox Code Playgroud)
结果:
无法导入名称ModelA
我做了一些禁止的事吗?谢谢
我想将变量全局变为2个以上的文件,以便在包含变量的文件中反映任何文件中的操作.
我在做的是:
b.py
import a
x = 0
def func1():
global x
x = 1
if __name__ == "__main__":
print x
func1()
print x
a.func2()
print x
Run Code Online (Sandbox Code Playgroud)
a.py
import b
def func2():
print b.x
b.x = 2
Run Code Online (Sandbox Code Playgroud)
我在这里搜索了线程,发现from a import *正在复制,import a否则.我希望上面的代码在执行时打印0 1 1 2(确定它应该在新行中),python b.py但它正在显示0 1 0 1
如何实现?
好的,就是这样。
我不想放弃我的代码,但是如果您确实需要它,我会的。我有两个彼此需要一点点的模块。这些模块称为webhandler和datahandler。
在webhandler中,我有一行:
import datahandler
Run Code Online (Sandbox Code Playgroud)
在数据处理程序中,我还有另一行:
import webhandler
Run Code Online (Sandbox Code Playgroud)
现在我知道这是糟糕的代码,并且这样的循环导入会导致代码运行两次(这是我试图避免的事情)。
但是,数据处理程序模块需要访问Web处理程序模块中的多个功能,并且Web处理程序模块需要访问在数据处理程序模块中生成的多个变量。除了将功能移动到不同的模块之外,我没有看到其他解决方法,但这会破坏程序的组织,并且对模块命名没有逻辑意义。
有什么帮助吗?
在 Django 项目中,我需要从 file-2 中的 file-1 导入 class-A。并从 file-2 导入 file-1 中的 B 类。
\n这些类有其独特的方法,我想在另一个文件中使用这些方法(如上面的描述)。
\n\n\nPython 3.8.10(在虚拟环境中)
\nWindows 10 - 64 位(最新版本)
\n姜戈 4.0.4
\n
当我运行时python manage.py runserver,我看到以下错误:
(my_ea_proj) PS F:\\my_ea_proj\\ea_proj> python.exe .\\manage.py runserver\nTraceback (most recent call last):\n File ".\\manage.py", line 30, in <module>\n main()\n File ".\\manage.py", line 13, in main\n django.setup()\n File "F:\\my_ea_proj\\lib\\site-packages\\django\\__init__.py", line 24, in setup\n apps.populate(settings.INSTALLED_APPS)\n File "F:\\my_ea_proj\\lib\\site-packages\\django\\apps\\registry.py", line 116, in populate\n app_config.import_models()\n File "F:\\my_ea_proj\\lib\\site-packages\\django\\apps\\config.py", line …Run Code Online (Sandbox Code Playgroud) 这是我正在制作的游戏.不过我自己也看不到问题.
这是错误和两个.py文件:
C:\Users\Rickard\My Programs\Python\slutarbete\New try>main.py
Traceback (most recent call last):
File "C:\Users\Rickard\My Programs\Python\slutarbete\New try\main.py", line 6,
in <module>
from rabbits import Rabbit
File "C:\Users\Rickard\My Programs\Python\slutarbete\New try\rabbits.py", line
3, in <module>
import main
File "C:\Users\Rickard\My Programs\Python\slutarbete\New try\main.py", line 6,
in <module>
from rabbits import Rabbit
ImportError: cannot import name Rabbit
Run Code Online (Sandbox Code Playgroud)
main.py
# -*- coding: utf-8 -*-
import pygame, sys, random, math
from rabbits import Rabbit
from pigs import Pig
from boars import Boar
from pygame.locals import *
from threading import Timer …Run Code Online (Sandbox Code Playgroud) python ×12
django ×2
import ×2
python-2.7 ×2
python-3.x ×2
abstraction ×1
class ×1
module ×1
oop ×1
pygame ×1
type-hinting ×1
typeguards ×1
windows ×1