Python 语法小结

背景和价值

变量

变量销毁

del 变量名

空值 None

temp = None
print(temp)
if temp == None:
print("none")

自定义类

self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

在函数内访问类的属性, 类名.属性名

class Employee:
   '所有员工的基类'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

https://www.runoob.com/python/python-object.html

python中的*args和**kwargs的用法详解

https://www.cnblogs.com/Ao0216/p/16696847.html

from import

1. 基本语法

模块(module)一个 .py 文件,包含 Python 代码(函数、类、变量等)。

from module import (
    item1,
    item2,
    item3
)
  • 作用:从 module 模块中导入 item1item2item3
  • 优点
    • 每行只导入一个内容,方便阅读。
    • 方便添加或删除导入项。
    • 在版本控制(如 Git)中,更容易跟踪修改。

2. 示例

单行导入

from langchain.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate

多行导入

from langchain.prompts import (
    ChatPromptTemplate,
    FewShotChatMessagePromptTemplate,
)

两种写法功能完全一样,但多行导入更清晰,尤其是在导入内容较多时。


3. 使用场景

场景 1:导入多个内容

from math import (
    sqrt,
    sin,
    cos,
    pi
)

场景 2:导入内容较多时

from langchain.prompts import (
    ChatPromptTemplate,
    FewShotChatMessagePromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

场景 3:导入内容较长时

from some_long_module_name import (
    SomeLongClassName,
    another_long_function_name,
    yet_another_long_variable_name,
)

import 如何避免导入冲突

在 Python 中,导入多个模块或函数时,可能会遇到 重名问题(即多个模块或函数有相同的名称)。为了避免这种情况,可以采取以下几种方法:


1. 使用 import 而不是 from ... import

  • 方法:直接导入模块,通过模块名访问函数或类。
  • 优点:避免函数名冲突,明确函数来源。
  • 示例
    import module1
    import module2
    
    module1.foo()  # 明确调用 module1 的 foo
    module2.foo()  # 明确调用 module2 的 foo
    

2. 使用 as 关键字重命名

  • 方法:在导入时为模块或函数指定别名。
  • 优点:解决重名问题,同时简化代码。
  • 示例
    from module1 import foo as foo1
    from module2 import foo as foo2
    
    foo1()  # 调用 module1 的 foo
    foo2()  # 调用 module2 的 foo
    

3. 使用 import 导入模块并重命名

  • 方法:导入整个模块并为其指定别名。
  • 优点:避免重名问题,同时减少代码冗余。
  • 示例
    import module1 as m1
    import module2 as m2
    
    m1.foo()  # 调用 module1 的 foo
    m2.foo()  # 调用 module2 的 foo
    

4. 使用 __all__ 控制模块的公开接口

  • 方法:在模块中定义 __all__ 变量,明确哪些函数或类可以被导入。
  • 优点:避免意外导入不需要的内容。
  • 示例
    # module1.py
    __all__ = ['foo', 'bar']
    
    def foo():
        print("module1 foo")
    
    def bar():
        print("module1 bar")
    
    def baz():
        print("module1 baz")
    
    # 使用 from module1 import *
    from module1 import *
    
    foo()  # 可以访问
    bar()  # 可以访问
    baz()  # 报错,未在 __all__ 中定义
    

5. 使用相对导入(适用于包内部)

  • 方法:在包内部使用相对导入(如 from . import module)。
  • 优点:避免与外部模块重名。
  • 示例
    # my_package/module1.py
    def foo():
        print("module1 foo")
    
    # my_package/module2.py
    from . import module1
    
    module1.foo()
    

6. 使用 sys.modules 检查模块是否已导入

  • 方法:在导入前检查模块是否已加载。
  • 优点:避免重复导入和潜在冲突。
  • 示例
    import sys
    
    if 'module1' not in sys.modules:
        import module1
    
    if 'module2' not in sys.modules:
        import module2
    

7. 使用命名空间包

  • 方法:将模块组织到不同的命名空间包中。
  • 优点:彻底避免重名问题。
  • 示例
    # 文件结构
    # namespace1/module1.py
    # namespace2/module1.py
    
    from namespace1 import module1 as m1
    from namespace2 import module1 as m2
    
    m1.foo()  # 调用 namespace1 的 module1
    m2.foo()  # 调用 namespace2 的 module1
    

8. 使用工具检查冲突

  • 方法:使用静态分析工具(如 flake8pylint)检查代码中的命名冲突。
  • 优点:提前发现问题,确保代码质量。
  • 示例
    flake8 my_script.py
    pylint my_script.py
    

参考资料

posted @ 2025-03-17 17:09  向着朝阳  阅读(14)  评论(0)    收藏  举报