• Tim Peters's avatar
    SF bug #488514: -Qnew needs work · 3caca232
    Tim Peters yazdı
    Big Hammer to implement -Qnew as PEP 238 says it should work (a global
    option affecting all instances of "/").
    
    pydebug.h, main.c, pythonrun.c:  define a private _Py_QnewFlag flag, true
    iff -Qnew is passed on the command line.  This should go away (as the
    comments say) when true division becomes The Rule.  This is
    deliberately not exposed to runtime inspection or modification:  it's
    a one-way one-shot switch to pretend you're using Python 3.
    
    ceval.c:  when _Py_QnewFlag is set, treat BINARY_DIVIDE as
    BINARY_TRUE_DIVIDE.
    
    test_{descr, generators, zipfile}.py:  fiddle so these pass under
    -Qnew too.  This was just a matter of s!/!//! in test_generators and
    test_zipfile.  test_descr was trickier, as testbinop() is passed
    assumptions that "/" is the same as calling a "__div__" method; put
    a temporary hack there to call "__truediv__" instead when the method
    name is "__div__" and 1/2 evaluates to 0.5.
    
    Three standard tests still fail under -Qnew (on Windows; somebody
    please try the Linux tests with -Qnew too!  Linux runs a whole bunch
    of tests Windows doesn't):
        test_augassign
        test_class
        test_coercion
    I can't stay awake longer to stare at this (be my guest).  Offhand
    cures weren't obvious, nor was it even obvious that cures are possible
    without major hackery.
    
    Question:  when -Qnew is in effect, should calls to __div__ magically
    change into calls to __truediv__?  See "major hackery" at tail end of
    last paragraph <wink>.
    3caca232
pydebug.h 1.1 KB

#ifndef Py_PYDEBUG_H
#define Py_PYDEBUG_H
#ifdef __cplusplus
extern "C" {
#endif

extern DL_IMPORT(int) Py_DebugFlag;
extern DL_IMPORT(int) Py_VerboseFlag;
extern DL_IMPORT(int) Py_InteractiveFlag;
extern DL_IMPORT(int) Py_OptimizeFlag;
extern DL_IMPORT(int) Py_NoSiteFlag;
extern DL_IMPORT(int) Py_UseClassExceptionsFlag;
extern DL_IMPORT(int) Py_FrozenFlag;
extern DL_IMPORT(int) Py_TabcheckFlag;
extern DL_IMPORT(int) Py_UnicodeFlag;
extern DL_IMPORT(int) Py_IgnoreEnvironmentFlag;
extern DL_IMPORT(int) Py_DivisionWarningFlag;
/* _XXX Py_QnewFlag should go away in 2.3.  It's true iff -Qnew is passed,
  on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
  true divisions (which they will be in 2.3). */
extern DL_IMPORT(int) _Py_QnewFlag;

/* this is a wrapper around getenv() that pays attention to
   Py_IgnoreEnvironmentFlag.  It should be used for getting variables like
   PYTHONPATH and PYTHONHOME from the environment */
#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s))

DL_IMPORT(void) Py_FatalError(char *message);

#ifdef __cplusplus
}
#endif
#endif /* !Py_PYDEBUG_H */