首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 为什么没有 main 函数?为什么我不推荐写 main 函数?

毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”…… 有些人是知情的,他的意图可能是模仿那些正宗的 main...某些编程语言以 main 函数作为程序的执行入口,例如 C/C++、C#、 Java、Go 和 Rust 等,它们具有特定的含义: main 函数名是强制的,也就是要求必须有一个 main 函数 main...之所以有些知情人要写if __name__ == '__main__' ,可能想表明 main() 只有在当前脚本被直接执行时才运行,不希望被导入其它模块时运行。...推荐阅读:Python 中 -m 的典型用法、原理解析与发展演变 不推荐写if __name__ == '__main__'。首先,如果只有一个文件的话,因为不存在导出的可能,不建议写。...最后,多文件的非入口文件也不建议写,因为在非入口文件中写这个判断,最大的作用就是写一些测试代码,但是测试代码应该分离出来,写到专门的目录或文件中。

2.5K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ 中的static关键字使用场景

    在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。...静态全局变量 i 有以下特点: 该变量在全局数据区分配内存; 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化); 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的...静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。...A(4, 5); // 定义对象A,其构造函数会使countP增1 A.GetC(); //输出对象个数 Point B(A); //定义对象B,其构造函数会使countP增1...静态数据成员定义时要分配空间,所以不能在类声明中定义。

    3.4K40

    【C 语言】文件操作 ( getc 和 putc 函数 )

    文章目录 一、getc 函数 二、putc 函数 二、使用 getc 和 putc 函数实现文件加密操作 四、使用 getc 和 putc 函数实现文件解密操作 一、getc 函数 ---- getc...函数的作用是从 FILE* 指针指向的文件中读取 1 个字符 , int getc(FILE *stream); FILE *stream 参数 : 要读取字符的文件 ; int 返回值 : 读取到的字符返回...fclose(p); } printf("Main End\n"); return 0; } 执行结果 : 二、putc 函数 ---- putc 函数的作用是...: 使用 getc 函数读取一个字节 , 然后加密 , 再用 putc 函数写出一个字节到另外一个文件中 ; #include #define SEC 5 int main()...和 putc 函数实现文件解密操作 ---- 逐个字节加密 : 使用 getc 函数读取一个字节 , 然后解密 , 再用 putc 函数写出一个字节到另外一个文件中 ; #include <stdio.h

    1.1K10

    Java泛型之类型擦除类型擦除参考资料

    本文首发于个人网站:Java阿杜 类型擦除 学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组、无法调用泛型参数对象中对应的方法(当然,通过extends...this.b = b; } public void setC(T c) { this.c = c; } public static void main...this.b = b; } public void setC(Object c) { this.c = c; } public static void main...Java泛型依赖编译器实现,只存在于编译期,JVM中没有泛型的概念;那么,编译器做了什么工作呢?...我们通过字节码进行观察,可以看出:(1)Holder4和Holder4Raw两个类的字节码完全相同;(2)在main函数的33、41和49行就是编译器插入的checkcast语句; public class

    62020

    CVE-2017-16943 Exim UAF漏洞分析

    command, receive_getc is bdat_getc....yield_length表示的是堆还剩余的长度,每次命令的处理使用的是src/receive.c代码中的receive_msg函数 在该函数处理用户输入的命令时,使用next->text来储存用户输入,...,并且让receive_getc变为bdat_getc 第三步 发送BDAT \x7f 相关代码在src/smtp_in.c中的bdat_getc函数: int bdat_getc(unsigned lim...但是却没找到合适的利用链 发现由于Exim自己实现了一个堆管理,所以在heap1之后利用store_get再malloc一块堆是不行的因为current_block也会被修改为指向最新的堆块,所以必须要能在不使用...但是我找到的这些函数再调用后都会退出receive_msg函数的循环,所以没办法构造成一个利用链 引用 Exim源码 Bugzilla-2199

    2.3K50

    CVE-2017-16943 Exim UAF漏洞分析--后续

    在注释了dkim的配置后,在 dkim_exim_verify_init 函数的流程中,执行了一个 store_get 函数,申请了一个0x4000大小的堆,然后在 dkim_exim_verify_init...函数和 dkim_exim_verify_feed 函数中,都有如下的代码: store_pool = POOL_PERM; ...... store_pool = dkim_verify_oldpool...; --------------- enum { POOL_MAIN, POOL_PERM, POOL_SEARCH }; store_pool全局变量被修改为了1,之前说过了,exim自己实现了一套堆管理...然后把 receive_getc 换成 bdat_getc 函数 再做完这些的操作后,进入了 receive_msg 函数,按照上篇文章的流程差不多,显示申请了一个0x100的heap1 然后进入...> 0) 547 return lwr_receive_getc(chunking_data_left--); lwr_receive_getc=smtp_getc 通过该函数获取16356

    71660

    CVE-2017-16943 Exim UAF漏洞分析——后续

    在注释了dkim的配置后,在dkim_exim_verify_init 函数的流程中,执行了一个store_get 函数,申请了一个0x4000大小的堆,然后在dkim_exim_verify_init...函数和dkim_exim_verify_feed 函数中,都有如下的代码: store_pool = POOL_PERM; ...... store_pool = dkim_verify_oldpool...; --------------- enum { POOL_MAIN, POOL_PERM, POOL_SEARCH }; store_pool全局变量被修改为了1,之前说过了,exim自己实现了一套堆管理...然后把receive_getc换成bdat_getc函数 再做完这些的操作后,进入了receive_msg函数,按照上篇文章的流程差不多,显示申请了一个0x100的heap1 然后进入receive_getc...return lwr_receive_getc(chunking_data_left--); lwr_receive_getc=smtp_getc通过该函数获取16356个字符串 首先,我们发送

    1.4K80

    js写插件教程深入

    (this instanceof Fn)){ //只要不是new的,用Fn()直接调用的,这里的this绝对不指向Fn;让它从 //新new一下;直到下一次代码走else里的内容...constructor:Fn, getF:function(){ console.log(1); } } 2.默认参数 //我们用过一些插件,是可以传一些配置参数的,当然如果你不传的话它有默认的值...,getC到底写到this里还是原型里 //这要从内存说起;写到原型上,每执行一个实例,getC不需要开辟新的内存 //故,可以把一些纯计算的方法,写原型上,如果方法和实例本身有关,应该写道this中...兼容直接使用script标签引入该插件 global.MyPlugin = MyPlugin; //this,在浏览器环境指window,在nodejs环境指global //使用this而不直接用...window/global是为了兼容浏览器端和服务端 //将this传进函数体,使全局变量变为局部变量,可缩短函数访问全局变量的时间 })(this);

    13.8K10

    【C 语言】结构体相关 的 函数 指针 数组

    结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行的操作 : 结构体可以进行 拷贝 赋值操作, 可以作为 函数参数 和 函数返回值; 1....************************************************************************/ #include int main...", (*s).name, (*s).age); printf("student : s->name = %s, s->age = %d \n", s->name, s->age); } int main...low : 其中 low 是首元素的 首地址, high 是 尾元素的尾地址, 只有这样 它们的差的 0.5 倍才是准确的中值的首地址; 指针指向数组注意点 : 不要生成非法的指针, 指针不能指向数组之外的元素..., 0, "const", 0 }; int getword(char *, int); struct key *binsearch(char*, struct key*, int); int main

    3K20

    CCPP输入输出函数汇总分析

    C语言常用标准I/O函数 scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等...C++输入输常用函数(包含C) 流(stream)或标准I/O( 进程->fp->流(FILE+缓冲)->文件)(内存buf, 流fp): 每次输入一个字符: getc(); 格式:#include 函数从流中一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入用户缓冲区buf中。该缓冲区以null字符结尾。...而对于一次一行的方式,当每次结构体中有null字符时,fputs就会停止,所以也不能用它实现读结构,同时fgets中包含有null字节或换行符,其也不能正常工作。...补充:调用pread时,无法中断其定位和读操作,另外不更新文件指针。

    1.3K20
    领券