# vb2Py - With

Contents of this page:

- General
- Default Conversion
- List of Options

Specific options:

- EvaluateVariable
- WithVariablePrefix
- UseNumericIndex

# General

In VB, `With` blocks represent a shorthand for refering to a specific object. Properties and methods of the object can be referenced by just prefixing the name with a '.' and the base object name is infered from the context. Python has no such equivalent and therefore the objects must be written out in full. By default, a `with` variable is created and this is used to fully qualify the references. This is safe in cases where evaluation of the `With` object is expensive 1 but may make the code look less clear. To get around this, an option is avaialble to use the actual variable name.

# Default Conversion

VB | Python
--- | ---
    With MyObject
        .Height = 10
        .Width = .Height * .ScaleFactor
    End With
        _with5 = MyObject
        _with5.Height = 10
        _with5.Width = _with5.Height * _with5.ScaleFactor

# List of Options

Here are the options in the INI file:

    [With]
    # Once or EachTime, how many times to evaluate the with variable
    EvaluateVariable = Once
    # Name of with variable (only used if EvaluateVariable is Once)
    WithVariablePrefix = _with
    # Yes or No, use numeric index on with variable (needed if you every have nested Withs and EvaluateVariable = Once)
    UseNumericIndex = Yes

## EvaluateVariable

Syntax: `EvaluateVariable = Once | EveryTime`

The default behaviour is to evaluate the `With` object once at the start of the block. By setting this option to `EachTime` you can force the object to be evaluated each time it is required. This generally looks more natural but can lead to undesired side effects or slow run times depending on how expensive 1 the object is to calculate.

VB | Python
--- | ---
    ' VB2PY-Set: With.EvaluateVariable = EveryTime
    With MyObject
        .Height = 10
        .Width = .Height * .ScaleFactor
    End With
    ' VB2PY-Unset: With.EvaluateVariable
        MyObject.Height = 10
        MyObject.Width = MyObject.Height * MyObject.ScaleFactor

## WithVariablePrefix

Syntax: `WithVariablePrefix = name`

When EvaluateVariable is set to `Once`, this option determines the prefix used to name the variable used in the `With`. If UseNumericIndex is set to `No` then this option sets the variable name used, otherwise this is the prefix and the final variable will also include a unique ID number.

VB | Python
--- | ---
    ' VB2PY-Set: With.WithVariablePrefix = withVariable
    With MyObject
        .Height = 10
        .Width = .Height * .ScaleFactor
    End With
    ' VB2PY-Unset: With.WithVariablePrefix
        withVariable7 = MyObject
        withVariable7.Height = 10
        withVariable7.Width = withVariable7.Height * withVariable7.ScaleFactor

## UseNumericIndex

Syntax: `UseNumericIndex = Yes | No`

When EvaluateVariable is set to `Once`, this option determines whether a unique ID number is appended to the WithVariablePrefix to determine the variable name used to hold the object. If used, the index is incremented for each `With` constuct found. This option is always required to be `Yes` where the code includes nested `With` blocks and EvaluateVariable is set to `Once`. If neither of these conditions applies then it is safe to set this to `No`

VB | Python
--- | ---
    ' VB2PY-Set: With.UseNumericIndex = No
    With MyObject
        .Height = 10
        .Width = .Height * .ScaleFactor
    End With
    ' VB2PY-Unset: With.UseNumericIndex
        _with = MyObject
        _with.Height = 10
        _with.Width = _with.Height * _with.ScaleFactor

[1] | (1, 2) Expensive as in CPU time.