整理_Python工程目录.txt:
python的工程目录(名字是固定的,参考了Java中的工程目录名字):
1. 目录resource:放需要使用到的数据(该数据是永远不变的),比如输入的地图数据等。
2. 目录tmp:放变化的数据,比如某些数据1个月更新一次的,就放在tmp目录下
3. 目录pipeline:放一些流程化、衔接的工具,比如api_server、与前端对接的代码等。
4. 目录datadao:处理数据的代码包
5. 目录common:放置一些写死的常数,比如一些路径常数,比如common包下面的constant.py中,可以写:
import os
from trafficgo_nash.utils.config import CONF
SMALL_ROOT = os.path.abspath("./")
if CONF.dev == "offline":
SCC_CONF = "/opt/trafficgo/scc_yao/conf/scc.conf"
WCC_CONF = SMALL_ROOT + \
"/TrafficgoLite/" \
"lib/trafficgo-common-wcc-crypt-1.0.jar"
else:
SCC_CONF = "/opt/trafficgo/scc/conf/scc.conf"
WCC_CONF = os.path.abspath("./") + "/trafficgo-common-wcc-crypt-1.0.jar"
6. 目录utils(每次跑代码都会调用到):服务于全局的工具py,每次跑代码的时候都会调用到
7. 目录tools:一些工具类py,但不是每次跑代码都用到;比如我们每个月只划分一次子区,那么我们在划分子区时用到的代码就放在tools包下面,即该工具代码一个月才运行一次!
P.S. 我们可以从上述固定工程目录中,根据自己的需求进行选择!
python的工程目录(名字是自己设计的):
1. 目录control:控制代码,整个代码的核心主体,这个名字不是固定的,也可以叫目录algo,都可以!
2. 目录rules_service:规则引擎,根据设计的规则对控制量进行约束
3. 目录region_plan:计算信控区域方案下的相位差
4. 目录sumo_env:sumo仿真器的环境
...
然后我们在最外部写一个main.py,是整个程序的入口!
P.S. 如果某个功能我们在当前情况下,不使用,但是以后会使用到,那么我们可以给这个功能设置一个标志位,如果标志位为True,则启用,否则不使用。
通常,我们会将这个标志位添加到配置项config.py中,便于直接从外部修改它的值!而不是将这个标志位设置在该功能代码内部,这样不便于使用者修改它的值!
整理python__函数参数__有默认值的写法(学会用kwargs).txt:
函数入参,有默认值的写法(以下两种写法都可以):
写法1:
def test_1(inference_date = None):
if inference_date is not None:
print(inference_date)
else:
print("Please input the inference date!")
test_1(inference_date="2020-07-27")
写法2:对于入参不确定的情况,要学会写kwargs(kwargs是个dict)
def test_1(**kwargs):
test_date = kwargs.get("inference_date")
if test_date is not None:
print(test_date)
else:
print("Please input the inference date!")
test_1(inference_date="2020-07-27")
还有PEP8的推荐写法:
def complex(real, imag=0.0):
return magic(r=real, i=imag)
以下写法不推荐!:
>>> def foo(bar=[]): # bar is optional and defaults to [] if not specified
... bar.append("baz") # but this line could be problematic, as we'll see...
... return bar
在上面这段代码里,一旦重复调用foo()函数(没有指定一个bar参数),那么将一直返回'bar'。因为没有指定参数,那么foo()每次被调用的时候,都会赋予[]。下面来看看,这样做的结果:
>>> foo()
["baz"]
>>> foo()
["baz", "baz"]
>>> foo()
["baz", "baz", "baz"]
参考:
http://3ms.huawei.com/km/groups/3685627/blogs/details/7975331
整理__python单例.txt:
Python单例:在全局该类只有1个实例;
把类设置为单例,那么第一次调用这个类后,已经计算好的属性就存成了静态变量,后面调用该属性就直接用了,不用重复计算了。如果后面再调用的时候,某个属性没被计算过,那么就会进行计算,然后存成静态变量。
设置成单例的方法:适用于这个类需要被频繁调用(并且每次的计算开销比较大),这样就不用重复计算了,直接取所需的属性即可。用单例可以提高效率!
P.S. 如果某个属性被修改后,那么在全局这个类属性就都变成了新的值!
参考:https://zhuanlan.zhihu.com/p/88400968
https://zhuanlan.zhihu.com/p/60269982
单例代码示例:
import threading
def synchronized(func):
func.__lock__ = threading.RLock()
def lock_func(*args, **kwargs):
with func.__lock__:
return func(*args, **kwargs)
return lock_func
class Singleton(type):
_instances = {}
@synchronized
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(
Singleton, cls).__call__(
*args, **kwargs)
return cls._instances[cls]
import random
class A(object, metaclass=Singleton):
def __init__(self):
self.a = random.random()
a = A()
b = A()
print(id(a)) # 139910027848784
print(id(b)) # 139910027848784 即这两个实例对象的地址是一样的!
print(a.a) # 0.6519248674842676
b.a += 1
print(b.a) # 1.6519248674842677
print(a.a) # 1.6519248674842677 即属性被改变后,全局都改变了!